2013-02-13 44 views
3

我想了解如何更好地構建Mongo查詢的索引,我看到運行長查詢的Mongo查詢。瞭解Mongo Explain索引掃描到許多結果

目前我看到的是這樣的:

"cursor" : "BtreeCursor modTime_-1_color_1 multi", 
"isMultiKey" : false, 
"n" : 0, 
"nscannedObjects" : 0, 
"nscanned" : 104936, 
"nscannedObjectsAllPlans" : 104935, 
"nscannedAllPlans" : 314806, 
"scanAndOrder" : false, 
"indexOnly" : false, 
"nYields" : 70, 
"nChunkSkips" : 0, 
"millis" : 14237, 
"indexBounds" : { 
    "modTime" : [ 
     [ 
      { 
       "$maxElement" : 1 
      }, 
      { 
       "sec" : 1360267645, 
       "usec" : 0 
      } 
     ] 
    ], 
    "color" : [ 
     [ 
      "Green", 
      "Green" 
     ], 
     [ 
      "Blue", 
      "Blue" 
     ], 
     [ 
      "Yellow", 
      "Yellow" 
     ] 
    ] 
}, 

與查詢看起來像:

{"modTime":{"$gte":{"sec":1360267645,"usec":0}},"color":{"$in":["Green","Blue","Yellow"]}} 

有什麼不同我應該做的事情,這樣它不是」創建這個索引噸掃描這麼多結果?

非常感謝您的意見和建議。

回答

4

已掃描計數是modTime大於所提供時間的文檔總數。

如果顏色字段有很好的變化性,那麼您可以從反轉索引中受益,因此顏色是第一個字段,modTime是第二個字段。

db.<collection>.createIndex({ color: 1, modTime : -1 }) 

然後這將只掃描modTime大於所提供的時間的正確顏色的文檔的數量。如果集合中唯一的顏色是綠色,藍色,黃色,那麼沒有任何好處。如果至少有一些額外的顏色,你應該得到一些好處。

警告:如果您的查詢只使用modTime,那麼他們將無法使用新的索引。

另一個可能的解決方案是用$ lt(或$ lte)表達式關閉modTime範圍。您必須確定您的查詢是否可能,或者是否會影響可評估文檔的數量。