MongoDB {聚合 $match} 对比 {find} 速度
MongoDB {aggregation $match} vs {find} speed
我有一个包含数百万行的 mongoDB 集合,我正在尝试优化我的查询。我目前正在使用聚合框架来检索数据并根据需要对它们进行分组。我的典型聚合查询类似于:$match > $group > $ group > $project
不过,我注意到最后几段只需要几毫秒,开始是最慢的。
我尝试仅使用 $match 过滤器执行查询,然后使用 collection.find 执行相同的查询。聚合查询需要大约 80 毫秒,而查找查询需要 0 或 1 毫秒。
我几乎每个字段都有索引,所以我想这不是问题所在。知道会出什么问题吗?或者它只是聚合框架的一个 "normal" 缺点?
我可以使用查找查询而不是聚合查询,但是我必须在请求后执行大量处理,并且可以使用 $group
等快速完成此过程,所以我宁愿保留聚合框架。
谢谢,
编辑:
这是我的标准:
{
"action" : "click",
"timestamp" : {
"$gt" : ISODate("2015-01-01T00:00:00Z"),
"$lt" : ISODate("2015-02-011T00:00:00Z")
},
"itemId" : "5"
}
aggregation framework
的主要目的是简化对大量条目的查询并生成少量对您有价值的结果。
如您所说,您还可以使用多个 find
查询,但请记住,您不能使用 find
查询创建新字段。另一方面,$group
阶段允许您定义新字段。
如果您想实现 aggregation framework
的功能,您很可能需要 运行 一个初始的 find
(或链接多个),提取该信息并用编程语言进一步操作它。
aggregation pipeline
似乎需要更长的时间,但至少你知道你只需要考虑一个系统的性能 - MongoDB 引擎。
然而,在处理从 find
查询返回的数据时,您很可能必须使用编程语言进一步处理数据,从而增加了复杂性,具体取决于编程的复杂性选择的语言。
您是否尝试过使用 explain() 来查找查询?它会让您很好地了解 find() 查询将花费多少时间。您可以对 $match 和 $explain 做同样的事情,看看索引访问和其他参数是否有任何差异。
此外,聚合框架的 $group 部分不使用索引,因此它必须处理聚合框架的 $match 阶段返回的所有记录。因此,为了更好地了解查询的工作原理,请查看结果集 returns 以及它是否适合内存以供 MongoDB.
处理
如果您关心性能,那么聚合无疑是一项耗时的任务,而不是查找子句。
当您在多个条件下获取记录、查找、分组和一些有限的记录(分页)时,最好使用聚合,同时当您必须获取非常大的数据集时,查找查询速度很快。你有一些人口,投影和没有分页我建议使用快速查找查询
我有一个包含数百万行的 mongoDB 集合,我正在尝试优化我的查询。我目前正在使用聚合框架来检索数据并根据需要对它们进行分组。我的典型聚合查询类似于:$match > $group > $ group > $project
不过,我注意到最后几段只需要几毫秒,开始是最慢的。
我尝试仅使用 $match 过滤器执行查询,然后使用 collection.find 执行相同的查询。聚合查询需要大约 80 毫秒,而查找查询需要 0 或 1 毫秒。
我几乎每个字段都有索引,所以我想这不是问题所在。知道会出什么问题吗?或者它只是聚合框架的一个 "normal" 缺点?
我可以使用查找查询而不是聚合查询,但是我必须在请求后执行大量处理,并且可以使用 $group
等快速完成此过程,所以我宁愿保留聚合框架。
谢谢,
编辑:
这是我的标准:
{
"action" : "click",
"timestamp" : {
"$gt" : ISODate("2015-01-01T00:00:00Z"),
"$lt" : ISODate("2015-02-011T00:00:00Z")
},
"itemId" : "5"
}
aggregation framework
的主要目的是简化对大量条目的查询并生成少量对您有价值的结果。
如您所说,您还可以使用多个 find
查询,但请记住,您不能使用 find
查询创建新字段。另一方面,$group
阶段允许您定义新字段。
如果您想实现 aggregation framework
的功能,您很可能需要 运行 一个初始的 find
(或链接多个),提取该信息并用编程语言进一步操作它。
aggregation pipeline
似乎需要更长的时间,但至少你知道你只需要考虑一个系统的性能 - MongoDB 引擎。
然而,在处理从 find
查询返回的数据时,您很可能必须使用编程语言进一步处理数据,从而增加了复杂性,具体取决于编程的复杂性选择的语言。
您是否尝试过使用 explain() 来查找查询?它会让您很好地了解 find() 查询将花费多少时间。您可以对 $match 和 $explain 做同样的事情,看看索引访问和其他参数是否有任何差异。
此外,聚合框架的 $group 部分不使用索引,因此它必须处理聚合框架的 $match 阶段返回的所有记录。因此,为了更好地了解查询的工作原理,请查看结果集 returns 以及它是否适合内存以供 MongoDB.
处理如果您关心性能,那么聚合无疑是一项耗时的任务,而不是查找子句。 当您在多个条件下获取记录、查找、分组和一些有限的记录(分页)时,最好使用聚合,同时当您必须获取非常大的数据集时,查找查询速度很快。你有一些人口,投影和没有分页我建议使用快速查找查询