这篇文章上次修改于 1998 天前,可能其部分内容已经发生变化,如有疑问可询问作者。 >我们经常碰到按某个key查询,然后sort的情况。尤其是热点数据(即经常limit 前 n条的数据),优化方案是,按{"sortKey" : 1, "queryCriteria" : 1} 建立索引。 1.有人可能疑惑,为什么,不按查询的queryCriteria排在前面呢,因为我们一般要先定位到查询的数据。这个是因为一个索引首先是一棵树。那么我们按sortkey在前的话,那么热点数据会集中在树的右边。又称--右平衡。我们limit的时候,几乎只遍历右边部分。虽然比queryCriteria 前面多便利了一部分记录,但是总体时间是比queryCriteria放前面快的。因为你queryCriteria找到以后,还要整个排序。相对很慢。 2.比如我们查询某篇文章的评论----按日期排序。那么我们一般只会获取前几页的评论。所以我们的符合索引如下: ```javascript db.comments.ensureIndex({"time" : 1, "articleId" : 1}) //查询时可以显式指定索引 db.comments.find({"articleId" : 3}). ... sort({"time" : -1}). ... hint({"time" : 1, "articleId" : 1}). ``` 3.注意mongodb中,你point query 点查询---索引1和-1没有区别的,mongo可以从索引命中后的开头遍历,也可以从结尾遍历。但是 多值查询(multivalue) 如 ```javascript db.users.find({"age" : {"$gte" : 21, "$lte" : 30}}). ... sort({"username" : 1}). ``` 因为索引命中age比较多,那么排序索引的顺序就很重要了,一般建议直接按经常排序的方向建立索引。如果两个方向都有索引,就建立两个索引---不同的方向,如果我们这样建立索引 ```javascript db.users.ensureIndex({"age" : 1, "username" : -1}) ``` 那么索引的排序如下: ![mongo索引实际排序][1] [1]: https://imgcdn.greenhtml.com/mongo-index-pic
没有评论