2016-04-14 45 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