看板 Database 關於我們 聯絡資訊
這邊好像沒什麼 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
a926:剛好有跟到fb討論 : ) 再次謝謝tony大的分享 01/02 13:41