2012-06-05 46 views
1

的MongoDB:非高性能指標

db.largecollection.find打後({$或:[{identifierX: 「sha1_hash123」},{identifierY: 「md5_hash456」},{identifierZ: 「another_hash789」 }]})

我檢查了mongodb自動準備的索引。除了標識符x/y/z的「單個」ensureIndex外,現在還有一個標識符X_1_identifierY_1_identifierZ_1,性能下降:-(

您有什麼想法或提示如何向mongodb解釋它的使用更快對於單標識符索引,因爲我沒有$和,但$或查詢?

THX

回答

3

的MongoDB不會創建自己的索引。這件事情,一個應用程序,用戶,或框架一樣。對於你的查詢,MongoDB只能使用identifierX,identifierY或identifierZ中的任何一個索引,但是如果你沒有這樣的索引,那麼當然不會使用索引identifierX_1_identifierY_1_identifierZ_1索引不能用於此查詢。

在這種情況下,你可能需要做一個索引所有這些標識符:

db.ensureIndex({ 'identifierX' : 1 }); 
db.ensureIndex({ 'identifierY' : 1 }); 
db.ensureIndex({ 'identifierZ' : 1 }); 

MongoDB中只能使用一個索引的時間,它會盡量挑選「最好」的一個。嘗試使用explain看哪個索引被拾起:

db.largecollection.find({ $or : [ 
    { identifierX : "sha1_hash123" }, 
    { identifierY : "md5_hash456" }, 
    { identifierZ : "another_hash789" } 
] }).explain(); 

這應該給你正在使用的索引的一些想法。

雖然有一個$or的例外,其中MongoDB可以爲每個部分使用不同的索引併爲您重新分配。它在docs。它(當然)仍然不會使用複合索引,並且您需要我在上面編寫的索引。

+0

你說得對。手動刪除三重索引後,它似乎沒問題。 「MongoDB一次只能使用一個索引」=>你建議我用什麼查詢來使用查找? {$或:[{identifierX:「sha1_hash123」},{identifierY:「md5_hash456」},{identifierZ:「another_hash789」}]}或更好3 * .find用於任何單個標識符Y/Y/Z併合並結果我自己? – ledy

+0

我認爲你需要對自己進行基準測試。我*懷疑*做3個查詢可能會更快。當然,你可以很聰明,只有在標識符X不匹配的時候纔可以對標識符Y或標識符Z進行查詢。 – Derick