【发布时间】: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