我对具有40k文档的集合进行了聚合查询。
{ aggregate: "REV_TABLE", pipeline: [ { $match: { r: { $lte: 1486066601 }, ISDI_ID: "17" } }, { $group: { _id: "$l", maxVer: { $max: "$r" } } } ] }
我有两个索引:{" r":1}和{" r":1," ISDI":1}并且后台索引已打开。 最初,当文件较小时,过去采用< 100毫秒。 现在它已经超过35k +,它的耗时超过300ms。
这是预期的吗?我猜测35k不是那么大但是为什么查询花了这么长时间才回来。
答案 0 :(得分:3)
我建议您查看Analyzing Query Performance in MongoDB的文档。
您可以在其末尾使用.explain("executionStats")
运行查询(例如db.collection.aggregate(yourQuery).explain('executionStats')
),然后您将获得分析查询每个部分性能的输出,包括索引扫描的时间,正在使用哪些索引等。然后,您可以采取措施来优化查询。或者,如果没有其他任何可以做的优化,那么你就会知道这只是你想要聚合的大量文档的结果。
请记住,聚合通常也适用于“管理员后端”和数据分析,并且在面向消费者的应用程序中不常使用,因为聚合很重。汇总集合只需要很长时间。
您也可以让MongoDB自动将慢查询的查询计划转储到集合中(阅读Database Profiling in MongoDB)。
例如,运行db.setProfilingLevel(1,20)
会将超过20毫秒的任何操作的查询计划转储到名为system.profile
的集合中。