インデックスの交差
重要
このページでは、 クエリオプティマイザがインデックス交差を使用できる可能性があるケースをドキュメントします。
実際には、クエリオプティマイザがインデックス交差を使用するプランを選択することはほとんどありません。
ハッシュベースのインデックスの交差はデフォルトで無効になっており、ソートベースのインデックスの交差はプラン選択では無効になっています。 誤ったプラン選択を防ぐために、オプティマイザーはこのように動作します。
スキーマ設計はインデックスの交差に依存すべきではありません。 代わりに、複合インデックスを使用する必要があります。
クエリオプティマイザの将来の改善により、システムはインデックス 交差プランが利用されるケースをより優れて識別できるようになる可能性があります。
MongoDB は、複数のインデックスの共通部分を使用してクエリを実行できます。 一般に、各インデックスの交差には 2 つのインデックスが含まれます。ただし、MongoDB では複数の/ネストされたインデックスの交差を使用してクエリを解決できます。
インデックスの交差を示すために、次のインデックスを持つコレクション orders
を考えてみましょう。
{ qty: 1 } { item: 1 }
MongoDB は、2 つのインデックスの共通部分を使用して、次のクエリをサポートできます。
db.orders.find( { item: "abc123", qty: { $gt: 15 } } )
MongoDB がインデックスの交差を使用しているかどうかを確認するには、 explain()
を実行します。 explain()の結果には、 AND_SORTED
ステージまたはAND_HASH
ステージのいずれかが含まれます。
インデックスのプレフィックスの交差
インデックスの交差により、MongoDB はインデックス全体またはインデックスのプレフィックスの交差を使用できます。 インデックスの プレフィックス は、複合インデックスの先頭から始まる 1 つ以上のキーで構成される複合インデックスのサブセットです。
次のインデックスを持つコレクションorders
について考えます。
{ qty: 1 } { status: 1, ord_date: -1 }
qty
フィールドとstatus
フィールドの両方に条件を指定する次のクエリを実行するために、MongoDB は 2 つのインデックスの共通部分を使用できます。
db.orders.find( { qty: { $gt: 10 } , status: "A" } )
インデックス交差と複合インデックス
インデックスが交差されている場合でも、複合インデックスを作成する必要が生じることはありません。 ただし、リストの順序(インデックスにキーがリストされる順序)とソート順序( 昇順または降順)について詳しくは、 複合インデックス を参照してください。複合インデックスでは、インデックス プレフィックスキーを含まないクエリ条件や、別のソート順序を指定するクエリ条件はサポートされない可能性があります。
たとえば、コレクションorders
に次の複合インデックスがあり、 ord_date
フィールドの前にstatus
フィールドがリストされているとします。
{ status: 1, ord_date: -1 }
複合インデックスは、次のクエリをサポートできます。
db.orders.find( { status: { $in: ["A", "P" ] } } ) db.orders.find( { ord_date: { $gt: new Date("2014-02-01") }, status: {$in:[ "P", "A" ] } } )
ただし、次の 2 つのクエリは対象外です。
db.orders.find( { ord_date: { $gt: new Date("2014-02-01") } } ) db.orders.find( { } ).sort( { ord_date: 1 } )
ただし、コレクションに 2 つの個別のインデックスがある場合は、次のようになります。
{ status: 1 } { ord_date: -1 }
2 つのインデックスは、個別に、またはインデックスの交差により、前述の 4 つのクエリをすべてサポートできます。
クエリをサポートする複合インデックスを作成するか、インデックスの交差に依存するかは、システムの仕様によって異なります。
インデックスの交差とソート
sort()
操作にクエリ述語とは完全に別のインデックスが必要な場合、インデックス交差は適用されません。
たとえば、 orders
コレクションには次のインデックスがあります。
{ qty: 1 } { status: 1, ord_date: -1 } { status: 1 } { ord_date: -1 }
MongoDB では、ソートを含む次のクエリではインデックスの交差は使用できません。
db.orders.find( { qty: { $gt: 10 } } ).sort( { status: 1 } )
つまり、MongoDB はクエリに{ qty: 1 }
インデックスを使用し、ソートには個別の{ status: 1 }
または{ status: 1, ord_date: -1
}
インデックスを使用しません。
ただし、インデックス{ status: 1, ord_date: -1 }
がクエリ述語の一部を実行できるため、MongoDB はソートを含む次のクエリではインデックス交差を使用できます。
db.orders.find( { qty: { $gt: 10 } , status: "A" } ).sort( { ord_date: -1 } )