gpt4 book ai didi

database - 在 $facet 中使用 $sort 和 $limit 时慢 Mongo 聚合

转载 作者:可可西里 更新时间:2023-11-01 09:53:34 24 4
gpt4 key购买 nike

我注意到在看似相同的聚合中存在巨大的性能差异,至少在概念上如此。测试是在一个简单的集合结构上进行的,它有一个 _id 和一个名称以及一个 createdAt,但其中有 2000 万个。 createdAt 上有一个索引。它托管在 mlab 集群上,版本为 3.6.9 WiredTiger。

我正在尝试使用聚合进行简单的分页,我知道我可以使用查找和限制,但我喜欢向管道添加更多元素,我给出的示例非常精炼。

db.getCollection("runnablecalls").aggregate([
{
$facet: {
docs: [
{ $sort: {createdAt: -1} },
{ $limit: 25 },
{ $skip: 0 },
],
page_info: [
{ $group: { _id: null, total: { $sum: 1 } }
}
],
}
}
])

这几乎需要 40 秒。现在,如果我将 $sort$limit 移到 facet 之外,它需要 0.042s

db.getCollection("runnablecalls").aggregate([
{ $sort: {createdAt: -1} },
{ $limit: 25 },
{
$facet: {
docs: [
{ $skip: 0 },
],
page_info: [
{
$group: { _id: null, total: { $sum: 1 } }
}
]}
},
])

page_info 方面在最后没有区别,我可以毫无区别地把它取出来,我只是把它留在里面,因为我喜欢用它。我知道如何在没有 $facet 的情况下使用两个查询(计数和聚合)来解决问题。我只是想了解为什么会这样。

最佳答案

第一个聚合不使用索引。第二个聚合使用索引并在进入 $facet 之前过滤前 25 个文档。您可以添加 explain('executionStats') 来查看查询计划和索引使用情况。例如,

db.getCollection("runnablecalls").explain('executionStats').aggregate([
{
$facet: {
docs: [
{ $sort: {createdAt: -1} },
{ $limit: 25 },
{ $skip: 0 },
],
page_info: [
{ $group: { _id: null, total: { $sum: 1 } }
}
],
}
}
])

关于database - 在 $facet 中使用 $sort 和 $limit 时慢 Mongo 聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54608362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com