2016-04-14 33 views
2

我在每個文檔中都有一個帶有locked字段的集合。 我有以下指標:MongoDB可能掃描文件以查找可能被索引覆蓋的操作

{ 
    locked : 1 
} 

當我執行這個解釋在計數操作

db.scheduled.find({locked: false}).explain({executionStats:1}) 
{ 
     "queryPlanner" : { 
       "plannerVersion" : 1, 
       "namespace" : "connectivity_recruiter.scheduled", 
       "indexFilterSet" : false, 
       "parsedQuery" : { 
         "locked" : { 
           "$eq" : false 
         } 
       }, 
       "winningPlan" : { 
         "stage" : "FETCH", 
         "inputStage" : { 
           "stage" : "IXSCAN", 
           "keyPattern" : { 
             "locked" : 1 
           }, 
           "indexName" : "locked_1", 
           "isMultiKey" : false, 
           "direction" : "forward", 
           "indexBounds" : { 
             "locked" : [ 
               "[false, false]" 
             ] 
           } 
         } 
       }, 

     ..... 

     "executionStats" : { 
       "executionSuccess" : true, 
       "nReturned" : 53045, 
       "executionTimeMillis" : 299, 
       "totalKeysExamined" : 53045, 
       "totalDocsExamined" : 53045, 
       "executionStages" : { 
         "stage" : "FETCH", 
         "nReturned" : 53045, 
         "executionTimeMillisEstimate" : 180, 
         "works" : 53046, 
         "advanced" : 53045, 
         "needTime" : 0, 
         "needFetch" : 0, 
         "saveState" : 417, 
         "restoreState" : 417, 
         "isEOF" : 1, 
         "invalidates" : 0, 
         "docsExamined" : 53045, 
         "alreadyHasObj" : 0, 
         "inputStage" : { 
           "stage" : "IXSCAN", 
           "nReturned" : 53045, 
           "executionTimeMillisEstimate" : 70, 
           "works" : 53046, 
           "advanced" : 53045, 
           "needTime" : 0, 
           "needFetch" : 0, 
           "saveState" : 417, 
           "restoreState" : 417, 
           "isEOF" : 1, 
           "invalidates" : 0, 
           "keyPattern" : { 
             "locked" : 1 
           }, 
           "indexName" : "locked_1", 
           "isMultiKey" : false, 
           "direction" : "forward", 
           "indexBounds" : { 
             "locked" : [ 
               "[false, false]" 
             ] 
           }, 
           "keysExamined" : 53045, 
           "dupsTested" : 0, 
           "dupsDropped" : 0, 
           "seenInvalidated" : 0, 
           "matchTested" : 0 
         } 
       }, 
     ........... 
} 

totalDocsExamined似乎表明,所有的文件,以便進行掃描算來,而這個操作可能是通過單獨使用索引執行。 發生了什麼?這是正常的嗎?對收藏進行全面掃描嗎?

感謝檢查

回答

0

返回的所有文檔,僅使用索引來過濾掉不檢索文檔。

如果你看看你的解釋,你會發現文檔的數量等於被檢查文檔的數量。

爲什麼?在獲取整個文檔時,您的索引只包含一個字段,mongodb所做的是查詢索引的鍵值,然後去獲取文檔。

唯一的情況是,當索引包含所有投影字段時,將不需要檢查的文檔是用於涵蓋查詢。

查看更多的此鏈接:https://docs.mongodb.com/manual/core/query-optimization/#covered-query