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})

最後に、以下のクエリはカバーリングインデックスクエリを使用できません:

  • すべてのインデックスフィールドが配列である
  • すべてのインデックスフィールドがサブドキュメントである
その他の拡張