2016-04-14 20 views
2

Ich habe eine Sammlung mit einem locked Feld in jedem Dokument. Ich habe den folgenden Index:MongoDB Scannen möglicherweise Dokumente für eine Operation, die durch einen Index abgedeckt werden konnte

{ 
    locked : 1 
} 

, wenn ich dies durchzuführen

eine Zähloperation erklären über
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 scheint anzuzeigen, dass alle Dokumente, um sie zu zählen gescannt werden, während dieser Vorgang könnte durchgeführt, indem der Index allein verwendet wird. Was passiert? Ist das normal? Wird die Sammlung vollständig gescannt?

Dank

Antwort

0

Alle zurück docs untersucht wurden, wurde der Index nur zum Filtern nicht zum Abrufen der Dokumente verwendet.

Wenn Sie Ihre Erläuterungen betrachten, werden Sie feststellen, dass die Anzahl der Dokumente der Anzahl der geprüften Dokumente entspricht.

Warum das? Ihr Index enthält nur ein Feld, während Sie das gesamte Dokument abrufen, was mongodb ist, den Index für die Schlüssel abzufragen und dann die Sammlung zu holen, um das Dokument zu holen.

Die einzige Situation, in der kein Dokument untersucht werden muss, ist für abgedeckte Abfragen, wenn der Index alle projizierten Felder enthält.

Weitere Informationen finden Sie unter folgendem Link: https://docs.mongodb.com/manual/core/query-optimization/#covered-query