【发布时间】:2015-04-06 12:13:55
【问题描述】:
我有一个包含数百万行的 mongoDB 集合,我正在尝试优化我的查询。我目前正在使用聚合框架来检索数据并根据需要对它们进行分组。我的典型聚合查询类似于:$match > $group > $ group > $project
但是,我注意到最后部分只需要几毫秒,开始是最慢的。
我尝试仅使用 $match 过滤器执行查询,然后使用 collection.find 执行相同的查询。聚合查询大约需要 80 毫秒,而查找查询需要 0 或 1 毫秒。
我几乎每个字段都有索引,所以我想这不是问题。关于可能出问题的任何想法?还是只是聚合框架的“正常”缺点?
我可以使用查找查询而不是聚合查询,但是我必须在请求之后执行大量处理,而这个过程可以通过 $group 等快速完成,所以我宁愿保留聚合框架。
谢谢,
编辑:
这是我的标准:
{
"action" : "click",
"timestamp" : {
"$gt" : ISODate("2015-01-01T00:00:00Z"),
"$lt" : ISODate("2015-02-011T00:00:00Z")
},
"itemId" : "5"
}
【问题讨论】:
-
您可以发布您的
$match并找到吗?在大多数用法中,$match和 find 应该是等价的,但我想确切地了解您正在比较的语句,以便做出准确的答案。另外,您是否先运行聚合然后运行查找?如果你一遍又一遍地重复这两个并比较时间会发生什么?不同之处可能在于将结果从磁盘移动到内存的成本。 -
我在第一篇文章中添加了标准,但是即使没有时间戳标准,我也看到了很大的差距。但是现在我想知道它是否与 find() 返回游标并且只显示第一个结果这一事实无关。
-
好的,我有很多无用的索引,所以我清理了所有内容并只创建了一个复合索引(使用我的 $match 过滤器的字段)。现在我在使用 $match 进行查找和聚合时具有良好的性能和相同的性能:) 问题解决了。
-
它可能还严重依赖于 mongodb 版本
-
$match 和 find() 是不同的,因为您不能对匹配阶段应用限制,它必须作为不同的阶段完成,从而降低效率
标签: mongodb aggregation-framework