MongoDB - 慢' $ group'性能

时间:2014-07-27 11:36:44

标签: performance mongodb pymongo

我有超过1,000,000条记录的MongoDB集合。 每个记录大小约为20K(因此总集合大小约为20GB)。

我有一个'类型'集合中的字段(可以有大约10个不同的值)。 我想获得该系列的per-type计数器。 此外,还有一个关于'类型'的索引。字段。

我测试了两种不同的方法(假设是python语法):

一种天真的方法 - 使用'计数'调用每个值:

for type_val in my_db.my_colc.distinct('type'):
    counters[type_val] = my_db.my_colc.find({'type' : type_val}).count()

将聚合框架与' $ group'一起使用语法:

counters = my_db.my_colc.aggregate([{'$group' :  {'_id': '$type', 'agg_val': { '$sum': 1 } }}])

我收到的第一种方法的性能比第二种方法快2个数量级。 似乎与count只在索引上运行而不访问文档这一事实有关,而$ group必须逐个遍历文档。 (它约1分钟对45分钟。)

有没有办法在'类型'上运行有效的分组查询? index,只使用索引,从而实现#1的性能结果,但使用聚合框架?

我正在使用MongoDB 2.6.1

更新: https://jira.mongodb.org/browse/SERVER-11447在MongoDB Jira中就此问题开放。

1 个答案:

答案 0 :(得分:1)

在聚合管道中,$ group子句不使用索引。它应该在$ match之后使用,它确实可以使用索引来加速它。

http://docs.mongodb.org/manual/core/aggregation-pipeline/#aggregation-pipeline-operators-and-performance

欢呼声,