MongoDB {aggregation $ match} vs {find} speed

时间:2015-02-06 11:03:40

标签: mongodb aggregation-framework

我有一个包含数百万行的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"
}

3 个答案:

答案 0 :(得分:23)

aggregation framework的主要目的是简化对大量条目的查询,并生成少量能够为您带来价值的结果。

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

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

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

然而,当涉及操纵从find查询返回的数据时,您很可能必须使用编程语言进一步操作数据,从而增加复杂性,这取决于编程语言的复杂性。选择。

答案 1 :(得分:6)

您是否尝试过使用explain()查找查询?它会让你很好地了解find()查询将花费多少时间。您可以使用$ explain&看看索引访问是否有任何差异其他参数。

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

答案 2 :(得分:0)

如果您对性能有所关注,那么毫无疑问,聚合是在花费时间而不是find子句。 当您在多个条件下获取记录,具有查找,分组和一些有限的记录(分页)时,最好使用aggregate,同时在find查询中,当您必须获取非常大的数据集时,查询速度很快。您有一些人口,预测和没有分页,我建议使用快速的查找查询