Mongodb:聚合排序限制查询的索引?

时间:2016-01-20 11:47:26

标签: mongodb sorting query-optimization mongodb-query

我正在从mysql迁移到mongodb。昨天开始学习mongodb。

我有一个很大的mysql表(超过400万行,每行超过300个字段),我正在移动到mongodb。

我们假设,products表包含以下字段 -

_id,类别和300多个其他字段。

要查找产品中的前5个类别及其计数,我有以下mysql查询

Select category, count(_id) as N from products group by category order by N DESC limit 5;

我在category字段上有一个索引,此查询在mysql中大约需要 4.4秒

现在,我已成功将此表格移至mongodb,这是我查找前5个类别及其计数的相应查询。

db.products.aggregate([{$group : {_id:"$category", N:{$sum:1}}},{$sort:{N: -1}},{$limit:5}]);

我再次在category上有一个索引,但查询似乎没有使用它(解释:true表示如此),并且此查询也需要 13.5秒

在阅读了有关mongodb聚合管道优化的更多内容之后,我发现我们需要在聚合之前使用sort来使索引工作,但我在聚合的派生字段上进行排序,因此无法在聚合函数之前将其引入。 / p>

如何在mongodb中优化这些查询?

=============================================== ========================== 解释输出

db.products.aggregate([{$group : {_id:"$category",N:{$sum:1}}},{$sort:{N: -1}},{$limit:5}], { explain: true });
{
        "waitedMS" : NumberLong(0),
        "stages" : [
                {
                        "$cursor" : {
                                "query" : {

                            },
                            "fields" : {
                                    "category" : 1,
                                    "_id" : 0
                            },
                            "queryPlanner" : {
                                    "plannerVersion" : 1,
                                    "namespace" : "mydb.products",
                                    "indexFilterSet" : false,
                                    "parsedQuery" : {
                                            "$and" : [ ]
                                    },
                                    "winningPlan" : {
                                            "stage" : "COLLSCAN",
                                            "filter" : {
                                                    "$and" : [ ]
                                            },
                                            "direction" : "forward"
                                    },
                                    "rejectedPlans" : [ ]
                            }
                    }
            },
            {
                    "$group" : {
                            "_id" : "$category",
                            "N" : {
                                    "$sum" : {
                                            "$const" : 1
                                    }
                            }
                    }
            },
            {
                    "$sort" : {
                            "sortKey" : {
                                    "N" : -1
                            },
                            "limit" : NumberLong(5)
                    }
            }
    ],
    "ok" : 1
}

1 个答案:

答案 0 :(得分:0)

目前在聚合框架可以用来改善我们用例的性能方面存在一些限制,但是,您应该能够通过首先对类别进行排序来加速查询。这将强制查询使用您添加的索引,并应加快管道第二部分中的组查询:

 db.products.aggregate([ 
    { "$sort" : { "category" : 1 },
    {$group : {_id:"$category",N:{$sum:1}}},
    {$sort:{N: -1}},{$limit:5}]);