什么是索引
- 索引就相当于字典中的目录(拼音 / 偏旁部首手)
- 有了目录我们就能通过目录快速的找到想要的结果
- 但是如果没有目录(拼音 / 偏旁部首手), 没有索引
- 那么如果想要查找某条数据就必须从前往后一条一条的查找
- 所以, 索引就是用于提升数据的查询速度的
?> 插入测试数据:
db.person.insert([
{name:'cs', age:19},
{name:'as', age:18},
{name:'bs', age:17},
]);
如何获取索引
- 格式如下:
db.<collection>.getIndexes()
- 示例:
db.person.getIndexes();
如何创建索引
- 格式如下:
db.<collection>.createIndex({<field>: <1 or -1>, ...}, <options>)
- <field>: 指定创建索引的字段(后面的数字分别代表:1 升序,-1 降序)
- <options>: 索引的额外配置
- 示例:
db.person.createIndex({name: 1})
如上索引创建之后的数据结构如下,给的是 1 所以是从大到小:
as: -> {name: 'as', age: 18}
bs: -> {name: 'bs', age: 17}
cs: -> {name: 'cs', age: 19}
如果是 -1 那么对应的数据结构同理可证是从小到大了。
创建单键索引
db.person.createIndex({name: 1})
查看是否使用索引
- 和 MySQL 一样, 我们可以通过
explain
来查看索引效果 - 格式如下:
db.<collection>.explain().<method()>
- 示例:
db.person.explain().find({name: 'as'})
在查询的结构当中只需要关心,winningPlan
的这个 key 对应的 stage
的取值即可,stage 不同取值所对应的含义如下:
- winningPlan -> stage -> COLLSCAN -> 遍历整个集合查询
- winningPlan -> stage -> IXSCAN -> 通过索引查询
- winningPlan -> stage -> FETCH -> 根据索引存储的地址取出对应文档
!> 和 MySQL 一样, MongoDB 默认也会为主键自动创建索引
db.person.getIndexes();
!> 如果查询条件中只需要查询出索引字段, 那么就不会再取出完整文档, 这样效率更高
db.person.explain().find({name: 'as'}, {_id: 0, name: 1})