MongoDB カバーリングインデックスクエリ
公式のMongoDBドキュメントでは、カバーリングクエリは以下のクエリであると説明されています:
- すべてのクエリフィールドがインデックスの一部であること
- クエリが返すすべてのフィールドが同じインデックス内にあること
クエリに出現するすべてのフィールドはインデックスの一部であるため、MongoDB はデータドキュメント全体を検索してクエリ条件に一致する結果を探し、同じインデックスを使用してクエリ結果を返す必要はありません。
インデックスはRAM内に存在するため、インデックスからデータを取得するほうが、ドキュメントをスキャンしてデータを読み取るよりもはるかに高速です。
カバーリングインデックスクエリを使用する
カバーリングインデックスクエリをテストするには、次の users コレクションを使用します:
{
"_id": ObjectId("53402597d852426020000002"),
"contact": "987654321",
"dob": "01-01-1991",
"gender": "M",
"name": "Tom Benzamin",
"user_name": "tombenzamin"
}
users コレクションに、フィールドが gender と user_name である複合インデックスを作成します:
>db.users.createIndex({gender:1,user_name:1})
注:5.0 より前のバージョンでは db.collection.ensureIndex() を使用できましたが、ensureIndex() は 5.0 以降で削除されたため、代わりに createIndex() を使用してください。
このインデックスは、以下のクエリをカバーします:
>db.users.find({gender:"M"},{user_name:1,_id:0})
つまり、上記のクエリに対して、MongoDB はデータベースファイル内を検索しません。代わりに、インデックスからデータを抽出します。これは非常に高速なデータクエリです。
インデックスには _id フィールドが含まれていないため、_id はクエリ内でデフォルトで返されます。MongoDB のクエリ結果セットからそれを除外することができます。
次の例では _id を除外していないため、クエリはカバーされません:
>db.users.find({gender:"M"},{user_name:1})
最後に、以下のクエリはカバーリングインデックスクエリを使用できません:
- すべてのインデックスフィールドが配列である
- すべてのインデックスフィールドがサブドキュメントである