为什么聚合框架比简单的查找查询要慢

时间:2019-09-27 03:52:41

标签: mongodb aggregation-framework

我是mongodb的新手,遇到了聚合框架的一些奇怪行为。

我有一个名为“ billingData”的集合,该集合大约有2M个文档。 我正在比较两个查询,它们给出的输出相同,但执行时间不同。

查询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),并在跳过100,000条记录后获取了50条记录。

有人可以解释一下为什么聚合框架以这种方式工作吗?

如何使它在性能上类似于查找查询?

0 个答案:

没有答案