【问题标题】:MongoDB {aggregation $match} vs {find} speedMongoDB {聚合 $match} 与 {find} 速度
【发布时间】: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


【解决方案1】:

aggregation framework 的主要目的是简化对大量条目的查询并生成少量对您有价值的结果。

正如您所说,您还可以使用多个find 查询,但请记住,您不能使用find 查询创建新字段。另一方面,$group 阶段允许您定义新字段。

如果您想实现aggregation framework 的功能,您很可能必须运行初始find(或链接多个),提取该信息并使用编程语言进一步操作它。

aggregation pipeline 可能需要更长的时间,但至少您知道您只需要考虑一个系统的性能 - MongoDB 引擎。

然而,在处理从find 查询返回的数据时,您很可能必须使用编程语言进一步处理数据,从而增加复杂性,具体取决于所选编程语言的复杂性。

【讨论】:

  • 感谢您的信息。但是,我仍然不明白为什么只有 $match 过滤器的聚合查询不如具有相同过滤器的简单查找查询快。
  • @Owumaro 我的问题与您评论中的问题完全相同。你找到答案了吗?
【解决方案2】:

您是否尝试过使用 explain() 来查找查询?它会让您很好地了解 find() 查询将花费多少时间。您可以使用 $explain 对 $match 执行相同的操作,并查看索引访问和其他参数是否有任何差异。

另外,聚合框架的 $group 部分不使用索引,因此它必须处理聚合框架的 $match 阶段返回的所有记录。因此,为了更好地了解查询的工作原理,请查看它返回的结果集以及它是否适合 MongoDB 处理的内存。

【讨论】:

    【解决方案3】:

    如果您关心性能,那么聚合无疑是耗时的任务,而不是 find 子句。 当您在多个条件下获取记录、查找、分组和一些有限的记录(分页)时,最好使用聚合,同时当您必须获取非常大的数据集时,查找查询速度很快。你有一些人口、投影并且没有分页我建议使用快速的查找查询

    【讨论】:

      猜你喜欢
      • 2015-12-03
      • 2020-07-09
      • 1970-01-01
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      相关资源
      最近更新 更多