Mongo聚合查询花费了很长时间

4

我有一个聚合查询,集合中有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+,所以查询所需时间超过了300毫秒。
这是否是预期的结果?我猜想35k并不算大,但为什么查询响应如此缓慢。

复合索引是在{"r":1 , "ISDI":1}还是{"r":1 , "ISDI_ID":1}上? - Josh Beam
1个回答

7

我建议查看MongoDB中分析查询性能的文档

在查询末尾加上.explain("executionStats")来运行你的查询(例如db.collection.aggregate(yourQuery).explain('executionStats')),你将得到一个输出,分析了查询的每个部分的性能,包括索引扫描所需的时间、使用哪些索引等。然后你可以采取措施优化你的查询。或者,如果没有更多的优化空间,那么你就会知道这只是因为你正在尝试合并大量文档而导致的。

请记住,聚合通常用于“管理后端”和数据分析,并不经常用于面向消费者的应用程序,因为聚合操作是很重的。它需要很长时间才能聚合集合。

你也可以让MongoDB自动将慢查询的查询计划转储到一个集合中(请参阅MongoDB中的数据库分析器)。

例如,运行db.setProfilingLevel(1,20)将把任何操作超过20毫秒的查询计划转储到一个名为system.profile的集合中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接