摘要
mongo 的索引非常强大,和关系型数据库索引没什么区别。这里主要介绍mongo索引基本知识和mongo本人在索引上的犯的错。
索引种类
- 单字段索引
复合索引
复合索引各个字段的顺序应该是精确匹配字段(=xxx),排序字段(避免在内存中排序,使用index排序),范围查询字段如db.book.find({company: ‘xxx’, age:{$lt:30}).sort({name:1})
db.book.find().explain("executionStats")
可以很好的列出查询执行计划。
总共有四个重要参数:
executionTimeMills:查询执行的时间
nReturned: 返回的文档数
totalKeysExamined: 索引扫描数
totalDocsExamined: 文档扫描数当然希望nReturned数目=totalKeysExamined
不扫描文档。(后面不挂着数据,index及数据)或者nReturned = totalKeysExamined = totalDocsExamined
如果有排序,为了不让排序在内存中进入,在nReturned = totalDocsExamined的基础上,totalKeysExamined可以大于nReturned。对于大数据量的内存排序会非常消耗性能如果我们创建一个复合索引是db.book.ensureIndex({company:1,age:1,name:1})
这时候nReturned = totalKeysExamined = totalDocsExamined
。因为查询会用到index,不需要额外的文档扫描。但是会有SORT stage,即在内存中排序,在大数据量的情况下内存排序是很慢的。尝试加一个index,在排序字段放在扫描字段前面
db.book.ensureIndex({company:1,name:1,age:1})
这时候发现mongo选择了新的index"indexBounds" : { "company" : [ "[\"a\", \"a\"]" ], "name" : [