mongo-索引

发布于 — 2020 年 04 月 14 日
#Mongo

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})