據對index prefixes文檔,查詢
db.example.find({ name : { $in : [ "Bart", "Homer" ] } });
將
db.example.createIndex({ "name": 1, "dob": 1 });
但不覆蓋
db.example.createIndex({ "hair": 1, "name": 1 });
因爲{ "name": 1 }
不是的preifx。
樣品
{ "_id": 1, "name": "Bart", "hair": "triangles", "dob": "1985-01-01" }
{ "_id": 2, "name": "Homer", "hair": "two", "dob": "1960-01-01" }
查詢1
> db.example.find(
> { name: { $in: [ "Bart", "Homer" ] } },
> { _id: 0, hair: 1, name: 1 }
>).explain("executionStats");
...
"executionStats": {
"totalKeysExamined": 2,
"totalDocsExamined": 2,
"executionStages": {
"stage": "PROJECTION",
"inputStage": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"indexName": "name_1_dob_1",
...
正如你看到的,使用name_1_dob_1
指數(因爲{ "name": 1 }
是{ "name": 1, "dob": 1 }
前綴,都在索引檢查2個文件( "totalKeysExamined": 2
),然後在集合中檢查了2個文檔("totalDocsExamined": 2
),因爲name_1_dob_1
索引沒有關於需要返回的hair
的信息。
查詢2
> db.example.find(
> { name: { $in: [ "Bart", "Homer" ] } },
> { _id: 0, dob: 1, name: 1 }
>).explain("executionStats");
...
"executionStats": {
"totalKeysExamined": 2,
"totalDocsExamined": 0,
"executionStages": {
"stage": "PROJECTION",
"inputStage": {
"stage": "IXSCAN",
"indexName": "name_1_dob_1",
...
至於查詢1,指數name_1_dob_1
使用和索引("totalKeysExamined": 2
)檢查2個文件,但也有到集合("totalDocsExamined": 0
)沒有呼叫,因爲索引name_1_dob_1
包含dob
和name
,並且不需要從集合中獲取更多內容。
謝謝,快樂:) – xameeramir