覆盖索引
官方的MongoDB的文档中说明,覆盖查询是以下的查询:
- 所有的查询字段是索引的一部分
- 所有的查询返回字段在同一个索引中
由于所有出现在查询中的字段是索引的一部分, MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引的查询结果。
因为索引存在于RAM中,从索引中获取数据比通过扫描文档读取数据要快得多。
不能使用覆盖索引查询:
- 所有索引字段是一个数组
- 所有索引字段是一个子文档
覆盖索引实践(客户端为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,说明查询没有扫描文档,只用了索引
截屏2021-02-26 下午4.01.22.png
3.返回字段不排除_id,则覆盖索引不起效,会扫描文档
高级索引
文档集合(demo_auto)
db.getCollection("demo_auto").insert([ {
name: "大名",
gender: "女",
age: "12",
tags:[
"music",
"cricket",
"blogs"
],
children:{
name:"小会",
age:10
}
} ]);
以上文档包含了tags数组和children子文档。
索引数组字段建索引
在数组中创建索引,需要对数组中的每个字段依次建立索引。所以在我们为数组 tags 创建索引时,会为 music、cricket、blogs三个值建立单独的索引。
db.demo_auto.ensureIndex({"tags":1})
创建索引后,我们可以这样检索集合的 tags 字段:
db.demo_auto.find({tags: "cricket"}).explain()
以上命令执行结果中会显示使用索引tags_1,则表示已经使用了索引。
索引子文档字段
假设我们需要通过子文档的字段来检索文档,所以我们需要对子文档建立索引。
为子文档的三个字段创建索引,命令如下:
db.demo_auto.ensureIndex({"children.name":1,"children.age":1})
通过以下查询语句来检索集合children字段:
db.demo_auto.find({"children.name": "小会"}).explain()
以上命令执行结果中会显示使用索引children_index,则表示已经使用了索引。