【问题标题】:Mongo aggregate query extremely slowMongo聚合查询极慢
【发布时间】:2015-03-05 23:10:21
【问题描述】:

所以,我正在运行我认为应该是一个相对简单的查询。本质上,我只是对特定字段中所有列表的长度求和。

我的数据库中有大约 250k 个文档,每个文档大约 200kb。查询如下所示,这是一个非常基本的聚合,但目前运行大约需要 30 分钟。我能做些什么来加快速度吗?我觉得将 250k 个元素相加需要半小时。

db.user_data.aggregate([{$group: {_id: null, count: {$sum: {$size: "$text"}}}}])

我正在运行 14.04 规格的 m3.large ec2 实例。

【问题讨论】:

  • 什么 MongoDB 版本以及每个文档的平均数组有多大?超过 500 个元素的数组不是一个好主意。如果您无法升级到 3.0.x,则可以尝试使用最新的 2.6.x 版本。
  • 使用 2.6.8。数组平均有 ~400-500 个元素,范围从 0 到 ~800
  • 好了。注意到超过 500 个元素的数组的性能会显着下降。我建议尝试将“大小”保持为文档中的一个元素,并且如果您将数组增长到这种大小,则还要重新考虑一般架构。您可以尝试与 mapReduce 语句相同的操作,但我不认为它可能会有改进,而且可能会更糟。
  • @NeilLunn 你能给我发一份关于性能下降的参考吗?我知道 mongo 不能优雅地处理数组,但它们并没有增长,我认为这是主要问题。这些文档或多或少会创建一次,我已经避免了此处详述的主要问题:askasya.com/post/largeembeddedarrays。我想我可以存储大小,但改变架构并不简单或直观。
  • 好吧,您可以将聚合输出到新集合中,并使用该集合来查询数据。这是 $out 设置的链接docs.mongodb.org/manual/reference/operator/aggregation/out

标签: mongodb performance aggregation-framework


【解决方案1】:

您可以尝试使用$unwind,看看它是否会更快:

db.user_data.aggregate([{$project:{text:1, _id:0}}, {$unwind:"$text"},
    {$group: {_id: null, count: {$sum: 1}}}])

【讨论】:

  • 嗯。 $size 是一个适用于数组的运算符。而您“加速”的解决方案是将文档复制多达 800 次,然后使用 $sum 来获取计数?那么您是否希望人们会发现这很有用?还是您认为他们可能会投票给“没用”?
  • 开头的$project 会在展开之前从文档中删除所有其他字段,因此不会进行重复。
  • 很抱歉$size 留在了那里,我现在已经更正了答案。
  • 它根本没有回答问题$size 正确的使用方法。项目并没有比已经完成的工作更“减少”(参见Aggregation Pipeline Optimization)。所以关键是您的$project$unwind 都需要付出更大的代价。所以这不可能“提高性能”,这就是问题所在。以及为什么没有人试图回答。阅读 cmets。数组大小是这里的问题。
  • 我能说什么,但对我来说,使用 $unwind 是否会像使用 $size 那样带来性能问题并不明显,而且对于 OP 来说,这似乎是一件足够简单的事情测试,在他的环境中对照他的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 2021-06-19
相关资源
最近更新 更多