2011-11-02 59 views
7

我知道,使用MongoDB時,對於使用複合索引的查詢,它必須使用索引中的所有鍵或至少一些鍵從左邊開始。例如Mongo複合索引,在查詢中使用少於全部

db.products.find({ "a":"foo", "b":"bar" }) 

將愉快地使用索引的製成的{A,B,C}。

但是,如果我要查詢:

db.products.find({"a":"foo", "c":"thing" }) 

我認爲這不能使用索引。這可以通過在「b」上添加一個微不足道的條件來解決,例如

db.products.find({"a":"foo", "b":{ $ne : "" }, "c":"thing" }) 

即使我實際上並不關心b的價值。原因是我們目前有4500萬個對象,並且它將繼續增長,所以我們希望整合我們的索引以節省資源。

非常感謝。

+0

你能解釋一下這些查詢嗎? –

+0

你的理解在雙重複合指數中是嚴格正確的,但在三重複合指數中不一定是正確的。使用解釋你將會看到,當你在a,c上查詢時,實際上會使用a,b,c索引。 –

回答

3

通常,對多列索引的查詢不足以限制其中一列的匹配將限制多列索引的實用性。在您的示例中,使用{"a":"foo", "b":{$ne:""}, "c":"thing"}的查詢條件將限制{a,b,c}索引僅用於匹配a的實用性。如果您的查詢條件將經常執行,請創建{a,c,b}索引(或{a,c},如果b不會用於查詢條件)。

在查詢中使用explain函數來查看是否正在充分利用索引。如果explain告訴你indexOnlytrue,那麼你的查詢只使用索引來查找匹配的文檔;否則,MongoDB需要查看每個文檔以查找匹配項。

欲瞭解更多信息,請參見:

0

事實上,使用較新的蒙戈的版本,您的{A,B,C}指數將當對{a,c}進行查詢時必須使用b上的無關緊要條件。我已經使用explain命令驗證了這一點。

這裏有一個詳細的討論:Mongo Triple Compound Index