MongoDB - 索引
索引数据结构
MongoDB的索引和MySQL一样用的是B+树
。由于在MySQL索引部分对B+树已经做了介绍,这里就不再描述啦,详见 MySQL - 存储&索引
虽然但是,很多地方都说MongoDB索引的数据结构是B-树,在我看了蛮多博客以及一些同学询问官方得到的回复,以及极客时间上MongoDB课程里对B-树更正为B+树的描述,应该用的就是B+树。
索引执行计划
例如,当文档中有两个索引,查询语句在两个索引上都做了匹配,候选计划会让两个线程同时尝试两个索引看哪个跑得更快,就是最优计划。
explain
语法:
db.col.find({name:"Rachel"}).explain(true)
MongoDB 索引类型
- 单键索引
- 组合索引
- 多值索引
- 地理位置索引
- 全文索引
- TTL索引
- 部分索引
- 哈希索引
组合索引 Compound Index
组合索引的最佳方式:ESR原则
- Equal 精确匹配方最前面
- Sort 排序条件放中间
- Range 范围匹配字段放最后面
为什么要遵循ESR原则,可以看一下两个例子:
🌰Equal在前面很好理解,可以使得查找的索引项更少。
🌰排序索引在范围索引前面,可以避免内存排序(如果数据量大会非常影响性能),只用做索引匹配。
地理位置索引
全文索引
部分索引
创建索引技巧
- 后台创建索引
db.col.createIndex({"city":1}, {background:true})
- 报表专用节点单独创建索引
- 设置该从节点priority为0
- 关闭该从节点
- 单机模式启动
- 添加索引
- 关闭该从节点,以副本集模式启动