Bar*_*man 10 performance mongodb pymongo
我有一个超过1,000,000条记录的MongoDB集合.每个记录大小约为20K(因此总集合大小约为20GB).
我在集合中有一个'type'字段(可以有大约10个不同的值).我想获得该系列的per-type计数器.此外,'type'字段有一个索引.
我测试了两种不同的方法(假设python语法):
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)
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中就此问题开放.
在聚合管道中,$group 子句不使用索引。它应该在 $match 之后使用,这确实可以使用索引来加快速度。
干杯,