MongoDB 聚合 V/S 简单查询性能?

Posted

技术标签:

【中文标题】MongoDB 聚合 V/S 简单查询性能?【英文标题】:MongoDB Aggregation V/S simple query performance? 【发布时间】:2017-04-28 12:53:27 【问题描述】:

我正在重新提出这个问题,因为我认为这个问题应该与这个in-mongodb-know-index-of-array-element-matched-with-in-operator 分开。

我正在使用 mongoDB,实际上我正在使用简单的查询来编写所有查询,这些查询包括查找、更新等(无聚合)。现在我阅读了许多 SO 帖子,例如 mongodb-aggregation-match-vs-find-speed。现在我想为什么要增加服务器上的计算时间,因为好像我会计算更多然后我的服务器负载会变得更多,所以我尝试使用聚合,我认为我现在正朝着正确的方向前进。但后来在我之前的问题andreas-limoli 告诉我不要使用聚合,因为它很慢,并且在服务器上使用简单的查询和计算。现在从字面上看,我对我应该使用什么感到迷茫,我从一年开始就在使用 mongoDB,但是当数据大小增加时我对它的性能一无所知,所以我完全不知道我应该选择哪个。

还有一件事我在任何地方都没有找到,如果聚合比它慢是不是因为 $lookup,因为 $lookup 是我考虑使用聚合的最重要的事情,因为否则我必须连续执行许多查询然后在我看来在聚合之前很差的服务器上进行计算。

另外,当我将数据从一个管道传递到另一个管道时,我读到了关于 mongodb 聚合的大约 100MB 限制,因此人们如何有效地处理这种情况,以及他们是否打开磁盘使用,因为磁盘使用比人们处理这种情况的方式减慢了一切。

此外,我还获取了 30,000 个样本集合,并尝试使用 $match 和 find 查询运行聚合,我发现聚合比 find 查询快一点,后者是聚合需要 180 毫秒才能执行,而 find 需要 220 毫秒来执行。

请帮帮我,这对我真的很有帮助。

【问题讨论】:

我也想弄清楚... 很好地引用了 mongoDB World “聚合是新发现”,他们长期以来一直在改进聚合性能。只要索引合适,就可以清除 find 总是比匹配聚合更快。 explain() 在您的案例中显示了什么? 当您想要执行 sum、maximum、minimum、avg 等功能时,将使用聚合。此外,如果您想要基于字段加入多个集合。 Find 应该用作基本的 where 子句。聚合不仅仅是一个简单的 find()。这可能是原因。 【参考方案1】:

MongoDB 中的聚合框架类似于 SQL 中的连接操作。聚合管道通常是资源密集型操作。因此,如果您的工作对简单查询感到满意,您应该首先使用那个。

但是,如果绝对必要,您可以使用聚合管道,以防您需要从多个集合中获取数据。

【讨论】:

【参考方案2】:

聚合管道是昂贵的查询。由于 CPU 内存,它可能会影响您作为不断增加的数据的性能。如果您可以实现 with find 查询,那就去做吧,因为一旦数据库数据增加,聚合的成本就会更高。

【讨论】:

以上是关于MongoDB 聚合 V/S 简单查询性能?的主要内容,如果未能解决你的问题,请参考以下文章

优化 MongoDB 聚合查询性能

MongoDB 查找与聚合性能

mongodb3 之单一用途聚合

mongoDB应用篇-mongo聚合查询

MongoDB 聚合中的多个 $project 阶段是不是会影响性能

提高查询性能mongodb