2012-04-24 144 views
1

我正在使用MongoDB 2.0.3(通過Mongoid)和一個紅寶石(1.9.3)應用程序。Mongodb查詢不使用索引

我有一個看起來一個複合索引,如:

index [ 
    [:attr1, Mongo::ASCENDING], 
    [:attr2, Mongo::ASCENDING], 
    [:attr3, Mongo::ASCENDING], 
    [:attr4, Mongo::ASCENDING] 
] 

而且,看起來像一個查詢:

Model.where(:attr3.ne => true, :attr4.ne => true). 
     extras(:hint => { :attr1 => Mongo::ASCENDING, 
         :attr2 => Mongo::ASCENDING, 
         :attr3 => Mongo::ASCENDING, 
         :attr4 => Mongo::ASCENDING }) 

然後我的代碼修改的結果,並更新它們。我有幾個進程運行上面的紅寶石應用程序,所有點擊保存mongodb服務器。我有一個相當大的分貝(超過30mil記錄,95gb的大小),並不斷被我的應用程序讀/寫。

我看到一個問題,有時查詢將使用索引,有時它不會(通過mongo shell中的db.currentOp())。爲什麼會發生這種情況,我該如何解決?

回答

3

創建多鍵索引時的順序很重要 - 如果您的查詢中沒有包含索引的第一個鍵(attr1和attr2),那麼MongoDB不能使用該索引。想象一下,如果你有一本物理詞典,並且你想查找第三個字母是「a」而第四個字母是「b」的單詞 - 字典的字母化沒有多大幫助。

要查找基於attr3和attr4的文檔,您需要一個多鍵索引,其中attr3和attr4是索引中的第一個鍵。

+0

感謝您的解釋 - 提出了很多意義! – gylaz 2012-04-27 22:51:06