複合インデックスの作成
複合インデックスは、複数のフィールドへの参照を含むインデックスです。 複合インデックスを使用すると、インデックス内のフィールドまたはインデックス プレフィックス内のフィールドのみに対するクエリのパフォーマンスが向上します。 よくクエリされるフィールドにインデックスを付けると、それらのクエリが対象となる 可能性が高くなります。つまり、MongoDB はドキュメントを検査せず、インデックスのみでクエリを満たすことができます。
複合インデックスを作成するには、 db.collection.createIndex()
メソッドを使用します。
db.<collection>.createIndex( { <field1>: <sortOrder>, <field2>: <sortOrder>, ... <fieldN>: <sortOrder> } )
制限
単一の複合インデックスで最大32フィールドを指定できます。
始める前に
これらのドキュメントを含むstudents
コレクションを作成します。
db.students.insertMany([ { "name": "Alice", "gpa": 3.6, "location": { city: "Sacramento", state: "California" } }, { "name": "Bob", "gpa": 3.2, "location": { city: "Albany", state: "New York" } } ])
手順
次の操作では、 フィールドと フィールドを含む複合インデックスが作成されます。name
gpa
db.students.createIndex( { name: 1, gpa: -1 } )
この例では、次のことが行われます。
name
のインデックスは昇順(1
)です。gpa
のインデックスは降順(-1
)です。
結果
作成されたインデックスは、以下を選択するクエリをサポートします。
name
フィールドとgpa
フィールドの両方。name
フィールドのみ。name
は複合インデックスのプレフィックスであるため。
たとえば、 インデックスは次のクエリをサポートしています。
db.students.find( { name: "Alice", gpa: 3.6 } ) db.students.find( { name: "Bob" } )
インデックスは、 gpa
はインデックスのプレフィックスの一部ではないため、 gpa
フィールドのみを対象とするクエリをサポートしていません。 たとえば、 インデックスは次のクエリをサポートしていません。
db.students.find( { gpa: { $gt: 3.5 } } )
詳細
効率的な複合インデックスの作成方法については、「ESR(Equality、Sort、Range)ルール」を参照してください。
ソート順序(昇順または降順)が複合インデックスのパフォーマンスにどのように影響するかについては、「インデックスを使用してクエリ結果をソートする 」を参照してください。
その他のインデックス タイプの詳細については、「インデックス タイプ 」を参照してください。
インデックスに指定可能なプロパティについては、「インデックスのプロパティ 」を参照してください。