的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。它(當然)仍然不會使用複合索引,並且您需要我在上面編寫的索引。
你說得對。手動刪除三重索引後,它似乎沒問題。 「MongoDB一次只能使用一個索引」=>你建議我用什麼查詢來使用查找? {$或:[{identifierX:「sha1_hash123」},{identifierY:「md5_hash456」},{identifierZ:「another_hash789」}]}或更好3 * .find用於任何單個標識符Y/Y/Z併合並結果我自己? – ledy
我認爲你需要對自己進行基準測試。我*懷疑*做3個查詢可能會更快。當然,你可以很聰明,只有在標識符X不匹配的時候纔可以對標識符Y或標識符Z進行查詢。 – Derick