2012-03-04 28 views
5

我有與四個字段化合物索引的集合,以便:(A,B,C,d)

當我查詢像

find({A: val1, B: val2, C: val3}).sort({D: 1}).limit(N) 

具有嚴格的在領域A,B,C中等於它運行得非常快,因爲它應該是。而explain()告訴我,只有N個文件被掃描。

如果我改變平等的一個$in運營商(在陣列約100元),它會掃描更多的文件數量,運行更慢:

find({A: {$in: [val0, val1, ...]}, B: val2, C: val3}).sort({D: 1}).limit(N) 

$or其他運營商也有同樣效果。

具有100個元素的邏輯上一個$in必須非常類似於具有嚴格等於的100個單獨查詢。第二個變體在數據庫中的運行速度要快得多,但需要通過後期排序和客戶端限制來獲取所有元素(沒有限制)。

是否有意義將這個查詢與$in拆分爲幾個查詢,其中等於使光標掃描的文檔數量減少?如果集合中有數百萬個文檔,會更有效率?

回答

2

你測試過索引{B:1,C:1,A:1,D:1}嗎?這樣可以快速處理確切的B和C值,可以在A字段上使用範圍,並且仍然可以通過索引完成用D排序。

+0

由於文件說,因爲MongoDB的V1.6.0在複合索引字段的順序不再重要: http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ 然而,我試過你的變種,沒有任何改變。 – DenisNP 2012-03-04 22:38:48

+1

@DenisNP:如果你的意思是[這一個](http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-4.Conserveindexesbyreorderingcolumnsusedonequality%28nonrange%29queries。),那麼你明白了錯誤。字段順序**在索引中很重要。它只是說你可以在沒有嚴重的性能影響的情況下從索引定義的末尾省略一些字段。 – 2012-03-05 07:42:40

+0

@SergioTulentsev:我的意思是[這個黃色框架](http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-IndexingProperties)。我錯了嗎? – DenisNP 2012-03-05 16:20:58