Docs Menu

インデックスの交差

重要

このページでは、クエリオプティマイザインデックスの交差を使用できる可能性があるケースをドキュメントします。

実際には、クエリオプティマイザがインデックス交差を使用するプランを選択することはほとんどありません。

ハッシュベースのインデックスの交差はデフォルトで無効になっており、ソートベースのインデックスの交差はプラン選択では無効になっています。 誤ったプラン選択を防ぐために、オプティマイザーはこのように動作します。

スキーマ設計はインデックスの交差に依存すべきではありません。 代わりに、複合インデックスを使用する必要があります。

クエリオプティマイザの将来の改善により、システムはインデックス 交差プランが利用されるケースをより優れて識別できるようになる可能性があります。

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" } )

インデックスが交差されている場合でも、複合インデックスを作成する必要が生じることはありません。 ただし、リストの順序(インデックスにキーがリストされる順序)とソート順序( 昇順または降順)について詳しくは、 複合インデックス を参照してください。複合インデックスでは、インデックス プレフィックスキーを含まないクエリ条件や、別のソート順序を指定するクエリ条件はサポートされない可能性があります。

注意

MongoDB Atlas でホストされている配置では、フィールド順序による制限を回避するために、 Atlas Search インデックスの使用を検討してください。

たとえば、コレクション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 } )

MongoDB Atlas を使用すると、クエリオプティマイザがインデックスの交差を含むプランを選択したときに、クエリを実行するための Atlas Search インデックスを作成できます。 複合インデックスとは異なり、Atlas Search インデックスのフィールドは任意の順序で定義できます。 その結果、Atlas Search インデックスは次のクエリをサポートできます。

インデックスの交差が必要な場合に Atlas Search インデックスを使用する方法に関するチュートリアルについては、「 Atlas Search による柔軟なクエリ 」を参照してください。

注意

Atlas Search インデックスは MongoDB Atlas クラスターでのみ使用でき、自己管理型配置では使用できません。 詳しくは、以下を参照してください。