→ a926:剛好有跟到fb討論 : ) 再次謝謝tony大的分享 01/02 13:41
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
這邊好像沒什麼 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 的索引應用策略