複合インデックスは、コレクション内の各ドキュメントの複数のフィールド値からデータを収集してソートします。複合インデックスを使用して、インデックスの最初のフィールドまたは任意のプレフィックス フィールドをクエリすることができます。複合インデックス内のフィールドの順序は非常に重要です。複合インデックスによって作成された B木は、インデックスがフィールドを指定する順序でソートされたデータを保存します。
たとえば、次の画像は、ドキュメントが最初に userid で昇順(アルファベット順)にソートされる複合インデックスを示しています。次に、各 userid の scores が降順でソートされます。
複合インデックスを作成するには、次のプロトタイプを使用します。
db.<collection>.createIndex( { <field1>: <sortOrder>, <field2>: <sortOrder>, ... <fieldN>: <sortOrder> } )
MongoDB Atlas でホストされる配置用 UI に複合インデックスを作成、管理できます。
ユースケース
アプリケーションが複数のフィールドを含むクエリを繰り返し実行する場合は、複合インデックスを作成してそのクエリのパフォーマンスを向上させることができます。たとえば、食料品店のマネージャーは、在庫商品を名前と数量で調べて、どの商品の在庫が少ないかを判断する必要が頻繁にあります。item フィールドと quantity フィールドの両方に複合インデックスを作成して、クエリのパフォーマンスを向上させることができます。
はじめる
複合インデックスを作成するには、[複合インデックスの作成] をご覧ください。
詳細
このセクションでは、複合インデックスの技術的詳細と制限について説明します。
フィールド制限
1 つの複合インデックスには最大 32 個のフィールドを含めることができます。
フィールドの順序
インデックスフィールドの順序は、複合インデックスの有効性に影響します。複合インデックスには、インデックスのフィールドの順序に従ってドキュメントへの参照が含まれます。効率的な複合インデックスを作成するには、ESR(等式、ソート、レンジ)ガイドラインに従ってください。
並び替え順
インデックスには、フィールドへの参照が昇順(1)または降順(-1)のソート順序でストアされます。複合インデックスの場合、ソート順序によって、インデックスがソート操作をサポートしているかどうかが決まります。詳細については、「複合インデックスのソート順序」を参照してください。
ハッシュ インデックス フィールド
複合インデックスには、単一のハッシュされたインデックス フィールド を含めることができます。
インデックスのプレフィックス
インデックスのプレフィックスは、インデックス フィールドの開始サブセットです。複合インデックスでは、インデックスのプレフィックスに含まれるすべてのフィールドに対するクエリがサポートされます。
たとえば、次の複合インデックスについて考えてみます。
{ "item": 1, "location": 1, "stock": 1 }
インデックスには以下のようなプレフィックスがあります。
{ item: 1 }{ item: 1, location: 1 }
MongoDB では、次のフィールドの組み合わせに対するクエリをサポートするために、複合インデックスを使用できます。
itemitemおよびlocationitem、locationやstock
MongoDB、itemフィールドがプレフィックスに対応しているため、インデックスを使用して item フィールドと stock フィールドに対するクエリをサポートすることもできます。ただし、インデックスの効率は { item: 1, stock: 1 } ほど高くありません。
たとえば、 "item": "saccharomyces cerevisiae"と"stock": 60のクエリを考えてみましょう。 コレクションに"item": "saccharomyces cerevisiae"に一致するドキュメントが 10000 個含まれ、かつ"stock": 60に一致するドキュメントが 100 個のみ含まれている場合、クエリは 10000 キーを検索します。 IXSCANステージでは、クエリはそれらのキーをstockフィールドでフィルタリングし、100 件の結果のみを次のステージに返します。
MongoDB のインデックス化戦略により、完全一致フィールドを特定の順序で配置する必要がなくなります。ただし、クエリで、ソート指定に先行する、またはソート指定と重複するインデックスのプレフィックスに等価条件が指定されていない場合、操作ではインデックスが効率的に使用されません。詳細については、「インデックスのソートと非プレフィックスサブセット」を参照してください。
MongoDB では、次のフィールドの組み合わせに対するクエリをサポートするために、複合インデックスを使用することはできません。
locationstocklocationおよびstock
item フィールドがない場合、前述のフィールドの組み合わせはいずれもプレフィックス インデックスに対応しません。
スパース複合インデックス
複合インデックスには、さまざまなタイプのスパースインデックスを含めることができます。インデックスのタイプの組み合わせによって、複合インデックスがドキュメントと一致する方法が決まります。
下表には、さまざまなタイプのスパースインデックスを含む複合インデックスの動作がまとめられています。
複合インデックスの構成要素 | 複合インデックスの動作 |
|---|---|
Ascending indexes Descending indexes | 1 つ以上のキーの値を含むドキュメントのみ、インデックスが作成されます。 |
| |
|
詳細
効率的な複合インデックスの作成方法については、「 ESR(Equality、Sort、Range)ガイド 」を参照してください。