MongoDB - 慢'$ group'表现

Bar*_*man 10 performance mongodb pymongo

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

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

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

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

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

使用具有'$ group'语法的聚合框架:

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

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

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

我正在使用MongoDB 2.6.1

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

dan*_*pot 4

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

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

干杯,

  • ...如果您需要像他所说的那样对整个集合进行分组,则没有太大帮助 (6认同)