Использует ли Mongo 3.4 индексы для этого запроса или нет?

Я использую набор сегментированных реплик. Имейте одну большую коллекцию со следующим индексом:

{ 
    "shop" : 1, 
    "email" : 1
}

Я пытаюсь найти лучший способ запроса каждого элемента один за другим:

db.user.explain('executionStats').find({shop:151, email:{$exists:true}}, {limit:1}))

и результаты следующие.

Мои вопросы: использует ли запрос индекс? Если да, как я могу прочитать этот результат explain?

Второе: лучше использовать этот запрос, зациклить курсор, а затем снова запросить

.find({магазин:151, электронная почта:{$exists:true}}, {лимит:100}))

or

.findOne({магазин:151, электронная почта:{$exists:true}}))

в непрерывном цикле?

{ 
"queryPlanner" : {
    "plannerVersion" : NumberInt(1), 
    "namespace" : "vt4users.user", 
    "indexFilterSet" : false, 
    "parsedQuery" : {
        "$and" : [
            {
                "shop" : {
                    "$eq" : NumberInt(151)
                }
            }, 
            {
                "email" : {
                    "$exists" : true
                }
            }
        ]
    }, 
    "winningPlan" : {
        "stage" : "PROJECTION", 
        "transformBy" : {
            "limit" : NumberInt(1)
        }, 
        "inputStage" : {
            "stage" : "FETCH", 
            "filter" : {
                "email" : {
                    "$exists" : true
                }
            }, 
            "inputStage" : {
                "stage" : "IXSCAN", 
                "keyPattern" : {
                    "shop" : NumberInt(1), 
                    "email" : NumberInt(1)
                }, 
                "indexName" : "shop_1_email_1", 
                "isMultiKey" : false, 
                "isUnique" : false, 
                "isSparse" : true, 
                "isPartial" : false, 
                "indexVersion" : NumberInt(1), 
                "direction" : "forward", 
                "indexBounds" : {
                    "shop" : [
                        "[151.0, 151.0]"
                    ], 
                    "email" : [
                        "[MinKey, MaxKey]"
                    ]
                }
            }
        }
    }, 
    "rejectedPlans" : [

    ]
}, 
"executionStats" : {
    "executionSuccess" : true, 
    "nReturned" : NumberInt(3), 
    "executionTimeMillis" : NumberInt(0), 
    "totalKeysExamined" : NumberInt(3), 
    "totalDocsExamined" : NumberInt(3), 
    "executionStages" : {
        "stage" : "PROJECTION", 
        "nReturned" : NumberInt(3), 
        "executionTimeMillisEstimate" : NumberInt(0), 
        "works" : NumberInt(4), 
        "advanced" : NumberInt(3), 
        "needTime" : NumberInt(0), 
        "needYield" : NumberInt(0), 
        "saveState" : NumberInt(0), 
        "restoreState" : NumberInt(0), 
        "isEOF" : NumberInt(1), 
        "invalidates" : NumberInt(0), 
        "transformBy" : {
            "limit" : NumberInt(1)
        }, 
        "inputStage" : {
            "stage" : "FETCH", 
            "filter" : {
                "email" : {
                    "$exists" : true
                }
            }, 
            "nReturned" : NumberInt(3), 
            "executionTimeMillisEstimate" : NumberInt(0), 
            "works" : NumberInt(4), 
            "advanced" : NumberInt(3), 
            "needTime" : NumberInt(0), 
            "needYield" : NumberInt(0), 
            "saveState" : NumberInt(0), 
            "restoreState" : NumberInt(0), 
            "isEOF" : NumberInt(1), 
            "invalidates" : NumberInt(0), 
            "docsExamined" : NumberInt(3), 
            "alreadyHasObj" : NumberInt(0), 
            "inputStage" : {
                "stage" : "IXSCAN", 
                "nReturned" : NumberInt(3), 
                "executionTimeMillisEstimate" : NumberInt(0), 
                "works" : NumberInt(4), 
                "advanced" : NumberInt(3), 
                "needTime" : NumberInt(0), 
                "needYield" : NumberInt(0), 
                "saveState" : NumberInt(0), 
                "restoreState" : NumberInt(0), 
                "isEOF" : NumberInt(1), 
                "invalidates" : NumberInt(0), 
                "keyPattern" : {
                    "shop" : NumberInt(1), 
                    "email" : NumberInt(1)
                }, 
                "indexName" : "shop_1_email_1", 
                "isMultiKey" : false, 
                "isUnique" : false, 
                "isSparse" : true, 
                "isPartial" : false, 
                "indexVersion" : NumberInt(1), 
                "direction" : "forward", 
                "indexBounds" : {
                    "shop" : [
                        "[151.0, 151.0]"
                    ], 
                    "email" : [
                        "[MinKey, MaxKey]"
                    ]
                }, 
                "keysExamined" : NumberInt(3), 
                "dupsTested" : NumberInt(0), 
                "dupsDropped" : NumberInt(0), 
                "seenInvalidated" : NumberInt(0)
            }
        }
    }
}, 
"serverInfo" : {
    "host" : "host", 
    "port" : NumberInt(27017), 
    "version" : "3.2.11", 
    "gitVersion" : "009580ad490190ba33d1c6253ebd8d91808923e4"
}, 
"ok" : NumberInt(1)

}


person Alexandru R    schedule 02.02.2017    source источник
comment
Вы используете 3.2, а не 3.4, как в заголовке вопроса. Хотя это не имеет значения.   -  person Alex Blex    schedule 02.02.2017


Ответы (1)


В вашем запросе используется файл index. Вы можете видеть это в inputStage

"stage" : "IXSCAN"

Вы можете проверить его в документации, чтобы лучше понять его значение.

Что касается вашего второго вопроса, если вы хотите получить все результаты, зацикливание с findOne НЕ лучше (с точки зрения производительности), чем обычное выполнение запроса.

person joao    schedule 02.02.2017
comment
действительно, я скопировал из местного монго. В любом случае, это не имеет значения. - person Alexandru R; 02.02.2017
comment
и действительно, в итоге я выбрал limit вместо find_one - person Alexandru R; 02.02.2017