作者TonyQ (自立而後立人)
看板Database
标题[Mongo] index 碰上 $in + sort limit(1)
时间Sun Dec 29 10:25:01 2013
这边好像没什麽 no-sql 的讨论,但还是贴过来。
---------------------------------
起因是这样的,我想找出系统中:
某用者 (fieldA) 第一次(limit)在某些事件中($in)出现的纪录。
所以我就下了
db.coll.find({fieldA:"value",type:{$in:[0,4,5]}})
.limit(1).sort({createDate:-1})
然後打了 index (fieldA :1,type:1,createDate:1)
结果这 request 比我想像中慢(约五十秒)。
但我分开下
db.coll.find({fieldA:"value",type:0 }).limit(1).sort({createDate:-1})
db.coll.find({fieldA:"value",type:4 }).limit(1).sort({createDate:-1})
db.coll.find({fieldA:"value",type:5 }).limit(1).sort({createDate:-1})
就非常快(几百毫秒内)
这就吸引起我的好奇心了,後来参考这篇文章的介绍,
提到 $in 的索引应用策略
http://blog.mongolab.com/2012/06/cardinal-ins/
其中他提到因为 $in 需要先把所有资料集合起来做完 merge 再处理,
所以反而没办法好好善用 createDate 已排序的优势快速的找出 limit。
同样的这篇文章也提到类似的问题
http://edgystuff.tumblr.com/post/43082387880/mongodb-indexing-tip-1-find-your-friends-recent
短网址:
http://goo.gl/Az5hF
事後我实验改打 (fieldA:1,createDate:1,type:1) ,
果然大幅加速我原本查询的速度。
在这个问题的处理上,multi-query (手动查多次在自己 merge )
或改打 index 应该都是可行的方向。提供给大家参考。
(我的FB 讨论原串
https://www.facebook.com/tonylovejava/posts/10202948029407417 )
--
网页上拉近距离的帮手 实现 GMail丰富应用的功臣
数也数不清的友善使用者体验 这就是javascript
欢迎同好到 AJAX 板一同讨论。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 58.115.68.19
1F:→ a926:刚好有跟到fb讨论 : ) 再次谢谢tony大的分享 01/02 13:41