MongoDB索引
Posted Just do it
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB索引相关的知识,希望对你有一定的参考价值。
索引就是用来加速查询的。数据库 索引与书籍的索引类似:有了索引就不需要翻遍整本书,数据库可以直接在索引中查找,使得查找速度能提高几个数量级。
1.1索引简介
现在要依照某个键查找:
> db.people.find({username : "mark"})
当查询中仅使用一个键时,可以对该键建立索引,以提高查询速度。
对"username"建立索引,创建索引要使用ensureIndex方法:
> db.people.ensureIndex({username : 1})
对于同一个集合,同样的索引只需要创建一次,反复创建是徒劳的。对某个键创建索引会加速对该键的查询。然而,对于其他查询可能没有帮助,即使是查询包含了被索引的键。
如下面的查询就不会从上面建立的索引中获得任何性能的提升。
> db.people.find({date:date1}).sort({date:1,username:1})
实践证明,一定要创建查询中用到的所有键的索引,如上面的查询,应该建立日期和用户名索引:
> db.people.ensureIndex({date : 1,username : 1})
传递给ensureIndex的文档其形式与传递给sort的文档形式一样:一组值为1或-1的键,表示索引创建的方向。若索引只有一个键,则方向无关紧要。若是有多个键,就得考虑索引的方向问题了。
比如以{"username" : 1,"age" : -1}这种方式创建索引,MongoDB会将用户名严格地按照字母升序排列,同名的组按照年龄降序排列。这对{"username" : 1,"age" : -1}这样的排序做了优化,但是对{"username" : 1,"age" : 1}就不那么有效了。要是想对其优化的话,则需建立{"username" : 1,"age" : 1}的索引以便按照年龄升序组织。
对用户名和年龄的索引同样能加快对用户名的查询。一般来说,如果索引包含N个键,则对于前几个键的查询都会有帮助。
只有使用索引前部的查询才能使用该索引。
MongoDB的查询优化器会重排查询项的顺序,以便利用索引:如查询{x:"foo",y:"bar"}的时候,已经有了{y:1,x:1}的索引,MongoDB会自己找到并利用它。
创建索引的缺点就是每次插入、更新和删除时都会产生额外的开销。这是因为数据库不但要执行这些操作,还要将这些操作在集合的索引中标记。因此,尽可能少创建索引,每个集合默认的最大索引个数为64个。
有些时候,最有效的办法居然是不使用索引,一般来说,要是查询要返回集合中一半以上的结果,用表的扫描会比几乎每条文档都检查索引要高效一些,所以,查询是否存在某个键,或者检查某个布尔类型值为真还是假,真的没有用索引的必要。
拓展索引
建立索引时要考虑的问题:
- 会做什么样的查询?其中哪些键需要索引?
- 每个键的索引方向是怎样的?
- 如何应对拓展?有没有种不同键的排列可以使常用数据更多地保留在内存中?
索引内嵌文档中的键
对内嵌文档的键建立索引和普通键创建的索引并没有什么区别。如想按日期搜索博客文章的评论,可以在由内嵌的"comments"文档组成的数组中对"date"键创建索引:
> db.blog.ensureIndex({"comments.date" : 1})
为排列创建索引
以上是关于MongoDB索引的主要内容,如果未能解决你的问题,请参考以下文章