Docs Menu
Docs Home
/
データベース マニュアル
/ /

クエリに効率的に応答するための選択的インデックスの作成

項目一覧

選択性とは、コレクション内のドキュメントの総数に対するクエリに一致するドキュメントの比率を記述するクエリプロパティです。インデックスの選択性は、ユニークインデックスキーが一致するドキュメントの数を示します。クエリまたはインデックスは、クエリまたは特定のインデックスキーに一致するドキュメントが比例的に少ない場合、クエリまたはインデックスの選択性が高くなります。

インデックスの選択性は、使用されるインデックスキーに応じて異なる可能性があるため、クエリに含まれる述語に基づいて最も選択性の高いインデックスが使用できることを確認してください。最も効率的なクエリ実行を実現するには、クエリに含まれる述語に最も一意に一致するインデックスを作成します。

次の形式を持つドキュメントのコレクションを考えてみましょう。

{
status: "processed",
product_type: "electronics"
}

この例では、コレクション内のドキュメントのstatus 99% の はprocessed です。status statusprocessedにインデックスを追加し、 を持つドキュメントをクエリすると、インデックスとクエリの両方の選択性が低くなります。ただし、status の がないドキュメントをクエリする場合、クエリはコレクション内のドキュメントのprocessed 1% のみを返すため、インデックスとクエリの選択性が高くなります。

statusフィールドがコレクション全体に分散された 3 つの値を持つドキュメントのコレクションを考えてみましょう。

[
{ _id: ObjectId(), status: "processed", product_type: "electronics" },
{ _id: ObjectId(), status: "processed", product_type: "grocery" },
{ _id: ObjectId(), status: "processed", product_type: "household" },
{ _id: ObjectId(), status: "pending", product_type: "electronics" },
{ _id: ObjectId(), status: "pending", product_type: "grocery" },
{ _id: ObjectId(), status: "pending", product_type: "household" },
{ _id: ObjectId(), status: "new", product_type: "electronics" },
{ _id: ObjectId(), status: "new", product_type: "grocery" },
{ _id: ObjectId(), status: "new", product_type: "household" }
]

status にインデックスを追加し、{ "status": "pending", "product_type": "electronics" } をクエリする場合、 MongoDB は3 つのインデックスキーを読み取り、そのステータスに一致する 3 つのドキュメントを取得し、それらのドキュメントを product_type でさらにフィルタリングして、一致する 1 つのドキュメントを返す必要があります。同様に、{ "status": {$in: ["processed", "pending"] }, "product_type" : "electronics" } のクエリで一致する 2 つのドキュメントが返されるには、6 つのドキュメントを読み取る必要があります。

statusがコレクション全体に9 つの値を持っているコレクションの同じインデックスを検討します。

[
{ _id: ObjectId(), status: 1, product_type: "electronics" },
{ _id: ObjectId(), status: 2, product_type: "grocery" },
{ _id: ObjectId(), status: 3, product_type: "household"},
{ _id: ObjectId(), status: 4, product_type: "electronics" },
{ _id: ObjectId(), status: 5, product_type: "grocery"},
{ _id: ObjectId(), status: 6, product_type: "household"},
{ _id: ObjectId(), status: 7, product_type: "electronics" },
{ _id: ObjectId(), status: 8, product_type: "grocery" },
{ _id: ObjectId(), status: 9, product_type: "household" }
]

{ "status": 2, "product_type": "grocery" } をクエリすると、 MongoDB はインデックスキーに一致するドキュメントを 1 つだけ読み取るため、インデックスの選択性が非常に高いことを示します。このインデックスを使用すると、クエリ応答をより効率的に受け取ることができます。これは、 MongoDB がインデックス値に一致するドキュメントを1 つだけさらにフィルタリングする必要があるためです。この場合、フィルターも一致し、クエリは 1 つのドキュメントのみを返します。

この例の status 等価に対するクエリの選択性はより高くなりますが、{ "status": { $gt: 5 }, "product_type": "grocery" } などのクエリでは、status で同じインデックスを使用する場合、4 つのドキュメントを読み取る必要があります。ただし、product_typestatus に複合インデックスを作成すると、 MongoDB は複合インデックスを介して {"status": { $gt: 5 }, "product_type": "grocery" } のクエリにより効率的に応答できます。これは、クエリが一致するドキュメントを 1 つだけ返すためです。

クエリのパフォーマンスを向上させるには、クエリが読み込むドキュメントを絞り込む 複合インデックス を作成します。例、statusproduct_type のクエリのパフォーマンスを向上させる場合は、これら 2 つのフィールドに複合インデックスを作成できます。

MongoDB が比較的多くのドキュメントを読み取って結果を返す場合、一部のクエリはインデックスがないほど高速に実行される場合があります。パフォーマンスを判断するには、「 インデックスの使用を測定する 」を参照してください。

戻る

クエリ結果のソート

項目一覧