Docs Menu
Docs Home
/
MongoDB マニュアル
/ /

クエリの選択性を確保するためのインデックスの作成

項目一覧

選択性とは、インデックスを使用して結果を絞り込むクエリの能力のことです。 効果的なクエリは選択性が高く、MongoDB はクエリを実行する作業の大部分にインデックスを使うことができます。

選択性を確保するには、インデックス付きフィールドで可能なドキュメントの数を制限するクエリを作成します。 インデックス付きデータに対して適切に選択的なクエリを作成します。

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

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

この例では、コレクション内のドキュメントの99 % の statusprocessedです。 statusにインデックスを追加し、 processedstatusを持つドキュメントをクエリすると、このクエリではインデックスの選択性が低くなります。 ただし、 processedstatusを持たないドキュメントをクエリする場合、クエリはインデックスの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_typestatusに複合インデックスを作成した場合、 { "status": { $gt: 5 }, "product_type": "grocery" }のクエリで読み取られる必要があるドキュメントは 2 つだけです。

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

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

戻る

RAM に確実に収める

項目一覧