MongoDB覆蓋索引查詢 和 高級(jí)索引

覆蓋索引

官方的MongoDB的文檔中說(shuō)明,覆蓋查詢是以下的查詢:

  • 所有的查詢字段是索引的一部分
  • 所有的查詢返回字段在同一個(gè)索引中
    由于所有出現(xiàn)在查詢中的字段是索引的一部分, MongoDB 無(wú)需在整個(gè)數(shù)據(jù)文檔中檢索匹配查詢條件和返回使用相同索引的查詢結(jié)果。
    因?yàn)樗饕嬖谟赗AM中,從索引中獲取數(shù)據(jù)比通過(guò)掃描文檔讀取數(shù)據(jù)要快得多。

不能使用覆蓋索引查詢:

  • 所有索引字段是一個(gè)數(shù)組
  • 所有索引字段是一個(gè)子文檔
覆蓋索引實(shí)踐(客戶端為navicat)

文檔集合(demo_auto)

db.getCollection("demo_auto").insert([ {
    _id: ObjectId("603746d62ff96a0006bea3d5"),
    name: "戚薇",
    gender: "女",
    age: "12"
} ]);
db.getCollection("demo_auto").insert([ {
    _id: ObjectId("603750ab5f3ee121e806620a"),
    name: "李沁",
    age: 10,
    gender: "女"
} ]);
db.getCollection("demo_auto").insert([ {
    _id: ObjectId("603774a85f3ee121e806620c"),
    gender: "男",
    name: "戚薇"
} ]);

1.新建索引gender_1_name_1



2.用覆蓋索引查詢(將_id排除查詢返回字段),檢查文檔為0,說(shuō)明查詢沒(méi)有掃描文檔,只用了索引


截屏2021-02-26 下午4.01.22.png

3.返回字段不排除_id,則覆蓋索引不起效,會(huì)掃描文檔

高級(jí)索引

文檔集合(demo_auto)

db.getCollection("demo_auto").insert([ {
    name: "大名",
    gender: "女",
    age: "12",
        tags:[
          "music",
      "cricket",
      "blogs"
        ],
    children:{
           name:"小會(huì)",
           age:10
        }
} ]);

以上文檔包含了tags數(shù)組和children子文檔。

索引數(shù)組字段建索引

在數(shù)組中創(chuàng)建索引,需要對(duì)數(shù)組中的每個(gè)字段依次建立索引。所以在我們?yōu)閿?shù)組 tags 創(chuàng)建索引時(shí),會(huì)為 music、cricket、blogs三個(gè)值建立單獨(dú)的索引。

db.demo_auto.ensureIndex({"tags":1})


創(chuàng)建索引后,我們可以這樣檢索集合的 tags 字段:

db.demo_auto.find({tags: "cricket"}).explain()



以上命令執(zhí)行結(jié)果中會(huì)顯示使用索引tags_1,則表示已經(jīng)使用了索引。

索引子文檔字段

假設(shè)我們需要通過(guò)子文檔的字段來(lái)檢索文檔,所以我們需要對(duì)子文檔建立索引。
為子文檔的三個(gè)字段創(chuàng)建索引,命令如下:

db.demo_auto.ensureIndex({"children.name":1,"children.age":1})


通過(guò)以下查詢語(yǔ)句來(lái)檢索集合children字段:

db.demo_auto.find({"children.name": "小會(huì)"}).explain()



以上命令執(zhí)行結(jié)果中會(huì)顯示使用索引children_index,則表示已經(jīng)使用了索引。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容