クエリの選択性を確保するためのインデックスの作成
項目一覧
選択性とは、インデックスを使用して結果を絞り込むクエリの能力のことです。 効果的なクエリは選択性が高く、MongoDB はクエリを実行する作業の大部分にインデックスを使うことができます。
選択性を確保するには、インデックス付きフィールドで可能なドキュメントの数を制限するクエリを作成します。 インデックス付きデータに対して適切に選択的なクエリを作成します。
例
多くの共通値による選択性
次の形式を持つドキュメントのコレクションを考えてみましょう。
{ status: "processed", product_type: "electronics" }
この例では、コレクション内のドキュメントの99 % の status
はprocessed
です。 status
にインデックスを追加し、 processed
のstatus
を持つドキュメントをクエリすると、このクエリではインデックスの選択性が低くなります。 ただし、 processed
のstatus
を持たないドキュメントをクエリする場合、クエリはインデックスの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 は 1 つの一致する結果を返すために 3 つのインデックスキーを読み取る必要があります。 同様に、 { "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 つのドキュメントのみを読み取ります。 一致するドキュメントが 1 つだけあり、クエリはインデックスを使用してその特定のドキュメントを選択できるため、インデックスとクエリの選択性が高くなります。
この例のstatus
等価に対するクエリはより選択的ですが、 { "status": { $gt: 5 }, "product_type": "grocery" }
などのクエリでは 4 つのドキュメントを読み取る必要があります。 ただし、 product_type
とstatus
に複合インデックスを作成した場合、 {
"status": { $gt: 5 }, "product_type": "grocery" }
のクエリで読み取られる必要があるドキュメントは 2 つだけです。
選択性を向上させるには、クエリが読み込むドキュメントを絞り込む複合インデックスを作成します。 たとえば、 status
とproduct_type
のクエリの選択性を向上させたい場合は、これら 2 つのフィールドに複合インデックスを作成できます。
MongoDB が多数のドキュメントを読み取って結果を返す場合、一部のクエリはインデックスがないほど高速に実行される場合があります。 パフォーマンスを判断するには、「インデックスの使用を測定する 」を参照してください。