mongodb之索引使用小结

在《权威指南》p68页中,作者提到:通过建立索引{date : -1, user : 1},这样,就可以保证最后几天更新的索引全部保存在内存中,这样,每个人的最新动态都将查询很快。
 
但是,这样的索引结构对于查询:db.test.find ({"user":1} ).sort("date":-1).limit(n)这个操作来说,问题是很大的。
 
经过explain测试,要查询上面这个语句,一定要建立索引为 [ (user , 1) , (date,-1) ] ,这样,无论你查询的是哪一个,同步查询多个用户,查询第多少页,都是非常快的。也是stackoverflow上推荐的做法。

索引建立语句:db.test.ensure_index([("user",1),("date",-1)])

 
而按照书上说的 [ (date,-1) , (user ,1) ]这种方式建立的索引,如果你使用的date精确度很高,就完全是按照date逆序排列的。如果你要查询上面这个语句,它基本就是按date逆序查找,可以想见速度将是非常慢的)
索引建立语句:db.test.ensure_index([("date",-1),("user",1)])
 
又或者是我查询的方式不对或者应用场景不同呢?可是作者确实说的是查询某一个用户的最新动态啊。。。书上说的尽可能多的将常用数据放在内存中的思想肯定是对的。我猜测,作者说的date应该是指一天,这样,按照查询db.test.find ({"user":1 , "date":xxx )。这样确实是可以的,但是这样的场景不合适啊。现在很少有看到按照日期刷动态的了吧?
 
联合索引:就是将索引的值直接合并,这样也就解释了为什么我们只能从前缀查询中获得加速。因为按顺序合并后,前缀必然还是有序的。而后缀仅仅是在查询单独的某一个前缀之后再排序,才会获得加速。
比如,我们在'a'&'b'上建立了联合索引,当我们查询a并按照b排序,则实际上我们会是首先仅仅查询a,然后才查询b,

posted on 2012-12-19 23:05  小龙人2012  阅读(140)  评论(0编辑  收藏  举报

导航