クエリに効率的に応答するための選択的インデックスの作成
項目一覧
選択性とは、コレクション内のドキュメントの総数に対するクエリに一致するドキュメントの比率を記述するクエリプロパティです。インデックスの選択性は、ユニークインデックスキーが一致するドキュメントの数を示します。クエリまたはインデックスは、クエリまたは特定のインデックスキーに一致するドキュメントが比例的に少ない場合、クエリまたはインデックスの選択性が高くなります。
インデックスの選択性は、使用されるインデックスキーに応じて異なる可能性があるため、クエリに含まれる述語に基づいて最も選択性の高いインデックスが使用できることを確認してください。最も効率的なクエリ実行を実現するには、クエリに含まれる述語に最も一意に一致するインデックスを作成します。
例
多くの共通値による選択性
次の形式を持つドキュメントのコレクションを考えてみましょう。
{ status: "processed", product_type: "electronics" }
この例では、コレクション内のドキュメントのstatus
99% の はprocessed
です。status
status
processed
にインデックスを追加し、 の を持つドキュメントをクエリすると、インデックスとクエリの両方の選択性が低くなります。ただし、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_type
と status
に複合インデックスを作成すると、 MongoDB は複合インデックスを介して {"status": { $gt: 5 }, "product_type": "grocery" }
のクエリにより効率的に応答できます。これは、クエリが一致するドキュメントを 1 つだけ返すためです。
クエリのパフォーマンスを向上させるには、クエリが読み込むドキュメントを絞り込む 複合インデックス を作成します。例、status
と product_type
のクエリのパフォーマンスを向上させる場合は、これら 2 つのフィールドに複合インデックスを作成できます。
MongoDB が比較的多くのドキュメントを読み取って結果を返す場合、一部のクエリはインデックスがないほど高速に実行される場合があります。パフォーマンスを判断するには、「 インデックスの使用を測定する 」を参照してください。