【问题标题】:Index optimization for mongodb aggregation frameworkMongoDB聚合框架的索引优化
【发布时间】:2013-11-04 15:56:13
【问题描述】:

我在 mongo 2.4.4 中有一个 match-unwind-group-sort 聚合管道,我需要加快聚合速度。

匹配操作由对 16 个字段的范围查询组成。我使用了.explain() 方法来优化范围查询(即创建复合索引)。是否有类似的功能来优化聚合?我正在寻找类似的东西:

db.col.aggregate([]).explain()

另外,我是否应该专注于索引优化?

【问题讨论】:

  • 有最新的不稳定:jira.mongodb.org/browse/SERVER-4504,但在那之前没有,并且没有使用超过数学的索引,因为这样的索引优化不是一个好的路径
  • @Sammaye 错了,匹配最肯定会像排序一样使用索引。
  • @AsyaKamsky 这就是我刚才所说的,我实际上是说 PAST the match,即在 $group 中
  • 索引优化是提高性能的唯一途径。
  • @AsyaKamsky 如果您已经按照他在问题中所说的那样对其进行了优化,则不会

标签: mongodb indexing aggregation-framework


【解决方案1】:

对于第一个问题,是的,您可以解释聚合。

db.collection.runCommand("aggregate", {pipeline: YOUR_PIPELINE, explain: true})

对于第二个,您为优化范围查询而创建的索引也将应用于聚合管道的 $match 阶段,如果它们发生在管道的开头。所以你专注于索引优化是对的。

Pipeline Operators and Indexes

更新 2

关于聚合解释的更多信息:在 2.4 版上它是不可靠的;在 2.6+ 上,它不提供查询执行数据。 https://groups.google.com/forum/#!topic/mongodb-user/2LzAkyaNqe0

更新 1

在 MongoDB 2.4.5 上的聚合解释记录。

$ mongo so
MongoDB shell version: 2.4.5
connecting to: so
> db.q19329239.runCommand("aggregate", {pipeline: [{$group: {_id: '$user.id', hits: {$sum: 1}}}, {$match: {hits: {$gt: 10}}}], explain: true})
{
    "serverPipeline" : [
        {
            "query" : {

            },
            "projection" : {
                "user.id" : 1,
                "_id" : 0
            },
            "cursor" : {
                "cursor" : "BasicCursor",
                "isMultiKey" : false,
                "n" : 1031,
                "nscannedObjects" : 1031,
                "nscanned" : 1031,
                "nscannedObjectsAllPlans" : 1031,
                "nscannedAllPlans" : 1031,
                "scanAndOrder" : false,
                "indexOnly" : false,
                "nYields" : 0,
                "nChunkSkips" : 0,
                "millis" : 0,
                "indexBounds" : {

                },
                "allPlans" : [
                    {
                        "cursor" : "BasicCursor",
                        "n" : 1031,
                        "nscannedObjects" : 1031,
                        "nscanned" : 1031,
                        "indexBounds" : {

                        }
                    }
                ],
                "server" : "ficrm-rafa.local:27017"
            }
        },
        {
            "$group" : {
                "_id" : "$user.id",
                "hits" : {
                    "$sum" : {
                        "$const" : 1
                    }
                }
            }
        },
        {
            "$match" : {
                "hits" : {
                    "$gt" : 10
                }
            }
        }
    ],
    "ok" : 1
}

服务器版本。

$ mongo so
MongoDB shell version: 2.4.5
connecting to: so
> db.version()
2.4.5

【讨论】:

  • 你只能解释不稳定的聚合查询,因此不应该认为你可以,你必须让人们意识到这还没有准备好生产并且版本不稳定并且可能会改变
  • 不,您可以在 MongoDB 2.4 中解释聚合。我一直这样做。
  • 真的吗?你能证明吗?也许显示解释的输出?
  • 啊,我知道为什么,这不适用于分片,所以该功能一直被标记为不完整,除非您进一步阅读相关任务,否则看不到这一点
  • @TomSwifty 这可能意味着您需要研究您的工作流程,map reduce 是一项非常缓慢的任务,并且旨在随着时间的推移进行大量聚合
猜你喜欢
  • 1970-01-01
  • 2014-05-04
  • 2014-12-14
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
相关资源
最近更新 更多