MongoDB-索引,你真的了解吗?

2023-09-26 22:47:24 浏览数 (1)

什么是索引

  • 索引就相当于字典中的目录(拼音 / 偏旁部首手)
  • 有了目录我们就能通过目录快速的找到想要的结果
  • 但是如果没有目录(拼音 / 偏旁部首手), 没有索引
  • 那么如果想要查找某条数据就必须从前往后一条一条的查找
  • 所以, 索引就是用于提升数据的查询速度的

?> 插入测试数据:

代码语言:json复制
db.person.insert([
    {name:'cs', age:19},
    {name:'as', age:18},
    {name:'bs', age:17},
]);

如何获取索引

  • 格式如下:
代码语言:json复制
db.<collection>.getIndexes()
  • 示例:
代码语言:json复制
db.person.getIndexes();

如何创建索引

  • 格式如下:
代码语言:json复制
db.<collection>.createIndex({<field>: <1 or -1>, ...}, <options>)
  • <field>: 指定创建索引的字段(后面的数字分别代表:1 升序,-1 降序)
  • <options>: 索引的额外配置
  • 示例:
代码语言:json复制
db.person.createIndex({name: 1})

如上索引创建之后的数据结构如下,给的是 1 所以是从大到小:

代码语言:text复制
as: -> {name: 'as', age: 18}
bs: -> {name: 'bs', age: 17}
cs: -> {name: 'cs', age: 19}

如果是 -1 那么对应的数据结构同理可证是从小到大了。

创建单键索引

代码语言:json复制
db.person.createIndex({name: 1})

查看是否使用索引

  • 和 MySQL 一样, 我们可以通过 explain 来查看索引效果
  • 格式如下:
代码语言:text复制
db.<collection>.explain().<method()>
  • 示例:
代码语言:json复制
db.person.explain().find({name: 'as'})

在查询的结构当中只需要关心,winningPlan 的这个 key 对应的 stage 的取值即可,stage 不同取值所对应的含义如下:

  • winningPlan -> stage -> COLLSCAN -> 遍历整个集合查询
  • winningPlan -> stage -> IXSCAN -> 通过索引查询
  • winningPlan -> stage -> FETCH -> 根据索引存储的地址取出对应文档

!> 和 MySQL 一样, MongoDB 默认也会为主键自动创建索引

代码语言:json复制
db.person.getIndexes();

!> 如果查询条件中只需要查询出索引字段, 那么就不会再取出完整文档, 这样效率更高

代码语言:json复制
db.person.explain().find({name: 'as'}, {_id: 0, name: 1})

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

0 人点赞