覆蓋索引
官方的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)使用了索引。






