首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongodb:为聚合排序限制查询建立索引?

Mongodb:为聚合排序限制查询建立索引?
EN

Stack Overflow用户
提问于 2016-01-20 11:47:26
回答 1查看 1K关注 0票数 0

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

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

让我们假设,products表有以下字段-

_id、类别和300+其他字段。

为了在产品中找到中的前5大类以及它们的计数,我有下面的mysql查询

代码语言:javascript
复制
Select category, count(_id) as N from products group by category order by N DESC limit 5;

我在category字段上有一个索引,这个查询在mysql中大约占用4.4秒

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

代码语言:javascript
复制
db.products.aggregate([{$group : {_id:"$category", N:{$sum:1}}},{$sort:{N: -1}},{$limit:5}]);

我在category上又有了一个索引,但是这个查询似乎并没有使用它(请解释: true是这么说的),而且这个查询还占用了13.5秒的

在阅读了更多关于mongodb聚合管道优化的内容之后,我发现我们需要在聚合之前使用排序才能使索引工作,但是我正在从聚合中对派生字段进行排序,所以不能将其放在聚合函数之前。

如何在mongodb中优化这样的查询?

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

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

发布于 2016-01-20 13:57:51

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

代码语言:javascript
复制
 db.products.aggregate([ 
    { "$sort" : { "category" : 1 },
    {$group : {_id:"$category",N:{$sum:1}}},
    {$sort:{N: -1}},{$limit:5}]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34899210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档