Понимание монго БД объяснить

Я запустил запрос и попытался объяснить его на консоли монго и получил

"isMultiKey" : true,
"n" : 8,
"nscannedObjects" : 17272,
"nscanned" : 17272,
"nscannedObjectsAllPlans" : 21836,
"nscannedAllPlans" : 21836,
"scanAndOrder" : true,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 184,

Большинство вещей объясняется в http://www.mongodb.org/display/DOCS/Explain, но я не могу понять, что означает nscannedObjectsAllPlans, nscannedAllPlans. Кто-нибудь может помочь?

Спасибо


person Global Warrior    schedule 20.09.2012    source источник


Ответы (1)


nscanned и nscannedObjects сообщают о результатах для победившего плана запроса.

nscannedAllPlans и nscannedObjectsAllPlans сообщают о результатах для всех планов.

Документ

Количество просканированных записей индекса. totalKeysExamined соответствует полю nscanned, возвращаемому cursor.explain() в более ранних версиях MongoDB.

Например:

t = db.jstests_explainb;
t.drop();

t.ensureIndex( { a:1, b:1 } );
t.ensureIndex( { b:1, a:1 } );

t.save( { a:0, b:1 } );
t.save( { a:1, b:0 } );

// Older mongodb (< 3.0? )
t.find( { a:{ $gte:0 }, b:{ $gte:0 } } ).explain( true );
    {
      "isMultiKey": false,
      "n": 2,
      "nscannedObjects": 2,
      "nscanned": 2,
      "nscannedObjectsAllPlans": 6,
      "nscannedAllPlans": 6,
      "scanAndOrder": false,
      "indexOnly": false,
      "nYields": 0,
      "nChunkSkips": 0,
      "millis": 2,
    ...
    }

// MongoDB 4.4
t.find( { a:{ $gte:0 }, b:{ $gte:0 } } ).explain( true );
{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test.jstests_explainb",
        ...
        "queryHash" : "CB67518C",
        "planCacheKey" : "5E76CDD1",
        "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "a" : 1,
                    "b" : 1
                },
                "indexName" : "a_1_b_1",
            }
        },
        "rejectedPlans" : [
            {
                "stage" : "FETCH",
                "inputStage" : {
                    "stage" : "IXSCAN",
                    "keyPattern" : {
                        "b" : 1,
                        "a" : 1
                    },
                    "indexName" : "b_1_a_1",
                }
            }
        ],
        ...
    },
    "executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 2,
        "executionTimeMillis" : 0,
        "totalKeysExamined" : 2, // <-- same as `nscanned`
        "totalDocsExamined" : 2, // <--
        "executionStages" : { ... }
        "allPlansExecution" : [
            {...},
            {...}
        ]
    }

person Gianfranco P.    schedule 20.09.2012
comment
Так что я должен беспокоиться, если nscannedObjectsAllPlans, nscannedAllPlans дают большое значение, в то время как nscanned все еще находится в допустимом диапазоне? - person Global Warrior; 20.09.2012
comment
Я так не думаю - я считаю, что только когда вызывается функция объяснения (), она выполняет эти другие планы в первую очередь. - person Eric Mill; 21.11.2012
comment
Запуск нескольких планов — это, по сути, то, как MongoDB решает, какой план запросов следует использовать. Он выполняет все планы, которые мог бы использовать, параллельно при первом запуске запроса, а затем периодически после ряда запросов или изменений данных. Как только один заканчивается, он кэшируется как план для использования, отменяет другие и будет использовать этот план до тех пор, пока в следующий раз не решит его обновить. - person David Mason; 09.09.2013
comment
@DavidMason, оптимизатор запросов, решает, какой план использовать, основываясь на том, какой план быстрее всего возвращает 101 документ. См. здесь docs.mongodb.org/manual/core/query-plans. - person Gianfranco P.; 09.09.2013