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