Docs Menu
Docs Home
/
MongoDBマニュアル
/ /

複合インデックス

項目一覧

  • ユースケース
  • はじめる
  • 詳細
  • フィールド制限
  • フィールドの順序
  • 並び替え順
  • ハッシュ インデックス フィールド
  • インデックスのプレフィックス
  • スパース複合インデックス
  • 詳細

複合インデックスは、コレクション内の各ドキュメントにある 2 つ以上のフィールドからデータを収集してソートします。インデックスの最初のフィールドによりデータはグループ化され、その後は後続のフィールドによりグループ化されます。

たとえば、次の画像は、ドキュメントが最初に userid によって昇順(アルファベット順)でグループ化されている複合インデックスを示しています。次に、各 useridscores が降順でソートされます。

``userid`` フィールド(昇順)と ``score`` フィールド(降順)の複合インデックスの図。インデックスのソートは最初に ``userid`` フィールドにより行われ、次に ``score`` フィールドで行われます。

よくクエリされるフィールドのインデックスを作成すると、カバード クエリになる可能性が高まります。カバード クエリとは、インデックスの使用で処理が完了し、ドキュメントを調査する必要がないため、パフォーマンスが大幅に向上するクエリです。

複合インデックスを作成するには、次のプロトタイプを使用します。

db.<collection>.createIndex( {
<field1>: <sortOrder>,
<field2>: <sortOrder>,
...
<fieldN>: <sortOrder>
} )

MongoDB Atlas でホストされる配置用 UI に複合インデックスを作成、管理できます。

アプリケーションが複数のフィールドを含むクエリを繰り返し実行する場合は、複合インデックスを作成してそのクエリのパフォーマンスを向上させることができます。たとえば、食料品店のマネージャーは、在庫商品を名前と数量で調べて、どの商品の在庫が少ないかを判断する必要が頻繁にあります。item フィールドと quantity フィールドの両方に複合インデックスを作成して、クエリのパフォーマンスを向上させることができます。

よくクエリされるフィールドに複合インデックスを作成すると、それらのクエリを対象とする可能性が高くなります。対象のクエリとは、ドキュメントを検査することなく、インデックスを使用して完全に満たすことができるクエリです。これにより、クエリのパフォーマンスが最適化されます。

複合インデックスを作成するには、「複合インデックスの作成」を参照してください。

このセクションでは、複合インデックスの技術的詳細と制限について説明します。

1 つの複合インデックスには最大 32 個のフィールドを含めることができます。

インデックス フィールドの順序は、複合インデックスの有効性に影響します。複合インデックスには、インデックス内のフィールドの順序に従ってドキュメントへの参照が含まれます。効率的な複合インデックスを作成するには、ESR(Equality、Sort、Range)ルールに従ってください。

インデックスには、フィールドへの参照が昇順(1)または降順(-1)のソート順序でストアされます。複合インデックスの場合、ソート順序によって、インデックスがソート操作をサポートしているかどうかが決まります。詳細については、「複合インデックスのソート順序」を参照してください。

複合インデックスには、単一のハッシュされたインデックス フィールド を含めることができます。

インデックスのプレフィックスは、インデックス フィールドの開始サブセットです。複合インデックスでは、インデックスのプレフィックスに含まれるすべてのフィールドに対するクエリがサポートされます。

たとえば、次の複合インデックスについて考えてみます。

{ "item": 1, "location": 1, "stock": 1 }

インデックスには以下のようなプレフィックスがあります。

  • { item: 1 }

  • { item: 1, location: 1 }

MongoDB では、次のフィールドの組み合わせに対するクエリをサポートするために、複合インデックスを使用できます。

  • item

  • item および location

  • itemlocationstock

MongoDB では、item フィールドがプレフィックスに対応しているため、インデックスを使用して item フィールドと stock フィールドに対するクエリをサポートすることもできます。ただし、このクエリをサポートできるのはインデックス内の item フィールドのみです。クエリには、location が後に続いている stock フィールドは使用できません。

インデックス フィールドは順番に解析されます。クエリでインデックスのプレフィックスが省略された場合、そのプレフィックスに続くインデックス フィールドは使用できません。

MongoDB では、次のフィールドの組み合わせに対するクエリをサポートするために、複合インデックスを使用することはできません

  • location

  • stock

  • location および stock

item フィールドがない場合、前述のフィールドの組み合わせはいずれもプレフィックス インデックスに対応しません。

Tip

冗長なインデックスを排除する

複合インデックスとそのプレフィックスのインデックスの両方を持つコレクションがある場合(たとえば、{ a: 1, b: 1 }{ a: 1 })、どちらのインデックスにもスパース性の制約または一意の制約がない場合は、プレフィックスのインデックス({ a: 1 })を除くことができます。MongoDB では、プレフィックス インデックスを使用していたであろうすべての状況で複合インデックスが使用されます。

複合インデックスには、さまざまなタイプのスパースインデックスを含めることができます。インデックスのタイプの組み合わせによって、複合インデックスがドキュメントと一致する方法が決まります。

下表には、さまざまなタイプのスパースインデックスを含む複合インデックスの動作がまとめられています。

複合インデックスの構成要素
複合インデックスの動作
Ascending indexes
Descending indexes
1 つ以上のキーの値を含むドキュメントのみ、インデックスが作成されます。
Ascending indexes
Descending indexes
geospatial フィールドのいずれかに値が含まれている場合にのみ、ドキュメントのインデックスが作成されます。昇順または降順インデックス形式のドキュメントのインデックスは作成されません。
Ascending indexes
Descending indexes
text フィールドのいずれかに一致するドキュメントのみ、インデックスが作成されます。昇順または降順インデックス形式のドキュメントのインデックスは作成されません。

効率的な複合インデックスの作成方法については、「ESR(Equality、Sort、Range)ルール」を参照してください。

戻る

埋め込みドキュメント