MongoDB的索引是基于B树的,B树也称为B-树。 为什么MongoDB是B树,MySQL的B+树? Mysql作为一个关系型数据库,数据的关联性是非常强的,区间访问是常见的一种情况,B+树由于数据全部存储在叶子节点,并且通过指针串在一起,这样就很容易的进行区间遍历甚至全部遍历。 MongoDB使用B-树,所有节点都有Data域,只要找到指定索引就可以进行访问,无疑单次查询平均快于Mysql。
Query Shape–查询的形状 即查询语句中的条件,使用不同的条件会执行不同的索引。
Index Prefix–索引前缀 即最左前缀原则,创建(a,b)联合索引后,就无需创建(a)索引
Selectivity–过滤性 选择索引时会选择过滤性最强的一个,假设有这样的一个例子: 根据条件a=1查询后得到记录1000条 根据条件b=2查询后得到记录100条 根据条件c=3查询后得到记录10条 如果现在要执行查询条件为a=1 and b=2 and c=3
并且只能创建一个索引,就应该将索引创建在c
字段上
查看执行计划:explain()db.col.find({name:111}).explain(true)
支持的索引类型
- 单键索引
- 组合索引
- 多值索引
- 地理位置索引
- 全文索引
- TTL索引
- 部分索引
- 哈希索引
组合索引
查询语句为db.members.find({ gender : "F" , age : {$gte : 18}}).sort("join_data":1)
这个查询中有精确匹配,排序,范围查询这三个条件。
组合索引的最佳方式:ESR原则
- 精确(Equal)匹配的字段放在最前面
- 排序(Sort)条件放中间
- 范围(Range)匹配的字段放最后
同样适合:ES,ER
创建索引:db.col.createIndex({name:1})
后台创建索引:db.member.createIndex({city:1},{background:true})