- 先题几个问题
- 什么是索引?
- 如何建立索引?
- 如何选择建立索引的字段?
- 如何强制使用索引?
- 如何评估索引效率?
如果把数据库比做书籍,那么索引即是目录,无需全文查找,在索引中找到条目以后,直接可以跳转到文档,如果不使用索引的话必须每次进行全文扫描
可以使用db.collection.ensureIndex({_id:1})
对_id字段建立索引
如果使用索引进行查询,通常结果也是按照索引序排列
如果对返回结果做了数量限制,通常把索引放在第一个位置
只有存在多个索引键时,方向才有意义
覆盖索引:如果查询的文档中仅仅返回索引字段,则没必要去查询真正的文档。
隐式索引:如果一个N个键的索引,那么可以免费得到前N个键按顺序组成的索引
$nin总是进行全表扫描
建立索引时,经常用来精确匹配对字段放在前面,范围匹配字段放在后面
$or 实际是使用两次查询,然后合并结果集
对嵌套文档建立索引db.collection.ensureIndex({'loc.city'})
。对嵌套文档本身和嵌套文档某一字段建立索引是完全不同的。对子文档建立的索引只有在进行与子文档顺序相同的匹配时才会使用索引。
对数组建立索引实际上就是对数组对每一个字段建立索引,所以数组索引代价相当高
索引基数:集合中某字段拥有不同值的数量,基数越高索引通常越有用
索引的效率苹果:exlpain()
db.collection.find().exlpain();
cursor
: 是否使用索引,以及使用哪个索引
n
:最终返回的文档
nscannedObjects
:按照索引指针去磁盘找文档的次数
nscanned
:如果使用索引,为查询的索引条目数量;否则,为查询文档数量
scannedAndOrder
:是否在内存中排序
indexOnly
:覆盖索引
millis
:执行好秒数
isMultikey
:是否为多键索引
如果返回文档占总文档比例较大,那么不建议使用索引
如果返回文档占总文档比例较小,那么建议使用索引
唯一索引:db.collection.ensureIndex({_id:1},{unique:true})
复合唯一索引: 单键可以不同,但是组合必须不同
唯一索引会把null看作值,因此无法把多个缺少唯一索引的文档存起来。
稀疏索引:db.collection.ensureIndex({_id:1},{sparse:true})
, 允许索引键不存在,但是提供了就必须思唯一的。
数据库的索引信息都存在system.index中
索引自定义名称:db.collection.ensureIndex({_id:1},{name:'lyf'})
删除索引:db.collection.dropIndex(name)
网友评论