2012-09-24 26 views
1

我有一個巨大的數百萬記錄集合,將有4個字段用於獲取數據,可以說f1, f2, f3用於過濾,f4用於數據排序。將有3種類型的查詢:需要爲MongoDb構建適當的組合索引

1) filter by f1 AND f2, and sort by f4 
2) filter by f1 AND f2 AND f3, and sort by f4 
3) filter by f1 AND f2 AND few additional fields, and sort by f4 

所以排序總是由f4。主要使用前兩種類型的查詢。案例3中的其他字段可能是集合中的任何字段(搜索功能),所以我不打算將它們用於索引。

我的建議是,唯一的組合鍵(f1, f2, f3, f4)可能是最好的解決方案,但由於我幾乎沒有mongoDb的經驗,我決定問你們。

+0

您是否在索要複合索引?如果是這樣,這是否有幫助:http://stackoverflow.com/questions/9901787/how-to-structure-a-compound-index-in-mongodb – themanatuf

+0

這是類似的問題,但不同的是我沒有範圍查詢,只像'{f1:2,f2:3}'或像'f1:{in:[2,3,4]}',所以我的問題主要是爲上述每個案例創建索引的必要性,或者一個複雜指數(f1,f2,f3,f4)將涵蓋所有情況。根據@slee answwer,我必須爲每種情況創建單獨的索引 – YMC

+0

好吧,事實證明$ in是一個範圍查詢,這就是我發現的:http://www.deanlee.cn/programming/mongodb-optimize -index規避-scanandorder / – YMC

回答

2

前兩個查詢以{f1:1,f2:1,f4:1}{f1:1,f2:1,f3:1,f4:1}開頭。您始終可以使用.find(...).sort({f4:1}).explain()來評估給定查詢所選索引的適當性。此外,您可能會發現對f1 AND f2 AND few additional fields查詢的部分查詢可能會從{f1:1,f2:1,addField1:1,f4:1}等其他索引中受益。

另外,請注意您是使用f4:1還是f4:-1,具體取決於您是否總是按照升序或降序排序f4