Почему структура агрегации медленнее простого поиска - PullRequest
2 голосов
/ 27 сентября 2019

Я новичок в mongodb и столкнулся с каким-то странным поведением структуры агрегации.

У меня есть коллекция с именем 'billingData', в этой коллекции приблизительно 2 млн документов.Я сравниваю два запроса, которые дают мне один и тот же вывод, но разное время их выполнения.

Запрос 1:

db.billingData.find().sort({"_id":-1}).skip(100000).limit(50)

План выполнения:

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "billingDetails.billingData",
        "indexFilterSet" : false,
        "parsedQuery" : {},
        "winningPlan" : {
            "stage" : "LIMIT",
            "limitAmount" : 50,
            "inputStage" : {
                "stage" : "SKIP",
                "skipAmount" : 100000,
                "inputStage" : {
                    "stage" : "FETCH",
                    "inputStage" : {
                        "stage" : "IXSCAN",
                        "keyPattern" : {
                            "_id" : 1
                        },
                        "indexName" : "_id_",
                        "isMultiKey" : false,
                        "multiKeyPaths" : {
                            "_id" : []
                        },
                        "isUnique" : true,
                        "isSparse" : false,
                        "isPartial" : false,
                        "indexVersion" : 2,
                        "direction" : "backward",
                        "indexBounds" : {
                            "_id" : [ 
                                "[MaxKey, MinKey]"
                            ]
                        }
                    }
                }
            }
        },
        "rejectedPlans" : []
    },
    "serverInfo" : {
        "host" : "ip-172-60-62-125",
        "port" : 27017,
        "version" : "3.6.3",
        "gitVersion" : "9586e557d54ef70f9ca4b43c26892cd55257e1a5"
    },
    "ok" : 1.0
}

Запрос 2:

db.billingData.aggregate([
    {$sort : {"_id":-1}},
    {$skip:100000},
    {$limit:50}
])

План выполнения:

{
    "stages" : [ 
        {
            "$cursor" : {
                "query" : {},
                "sort" : {
                    "_id" : -1
                },
                "limit" : NumberLong(100050),
                "queryPlanner" : {
                    "plannerVersion" : 1,
                    "namespace" : "billingDetails.billingData",
                    "indexFilterSet" : false,
                    "parsedQuery" : {},
                    "winningPlan" : {
                        "stage" : "FETCH",
                        "inputStage" : {
                            "stage" : "IXSCAN",
                            "keyPattern" : {
                                "_id" : 1
                            },
                            "indexName" : "_id_",
                            "isMultiKey" : false,
                            "multiKeyPaths" : {
                                "_id" : []
                            },
                            "isUnique" : true,
                            "isSparse" : false,
                            "isPartial" : false,
                            "indexVersion" : 2,
                            "direction" : "backward",
                            "indexBounds" : {
                                "_id" : [ 
                                    "[MaxKey, MinKey]"
                                ]
                            }
                        }
                    },
                    "rejectedPlans" : []
                }
            }
        }, 
        {
            "$skip" : NumberLong(100000)
        }
    ],
    "ok" : 1.0
}

Я ожидал таких же результатов отСтруктура агрегации и поиск запроса, но поиск запроса дал результаты в 2 секунды, и агрегация заняла 16 секундХотя в обоих запросах я сортирую свои документы в порядке убывания (на основе _id) и извлекаю 50 записей после пропуска 100 000 записей.

Может кто-нибудь объяснить мне, почему структура агрегации работает таким образом?

Что я могу сделать, чтобы производительность была похожа на запрос поиска?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...