我注意到,至少从概念上来说,在相同的集合中存在巨大的性能差异。测试是在一个简单的集合结构上进行的,该结构具有_id,名称和createdAt,但其中有2000万个。在createdAt上有一个索引。它托管在mlab群集上,版本为3.6.9 WiredTiger。
我正在尝试使用聚合进行简单的分页,我知道我可以使用find和limit,但是我想在管道中添加更多元素,我给出的示例非常简洁。
db.getCollection("runnablecalls").aggregate([
{
$facet: {
docs: [
{ $sort: {createdAt: -1} },
{ $limit: 25 },
{ $skip: 0 },
],
page_info: [
{ $group: { _id: null, total: { $sum: 1 } }
}
],
}
}
])
这几乎需要40s
。现在,如果我将$sort
和$limit
移动到构面之外,则需要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
的聚合)来解决问题。我只想了解为什么会这样。
答案 0 :(得分:0)
第一次聚合不使用索引。第二个聚合使用索引,并在输入$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 } }
}
],
}
}
])