Database 在$facet中使用$sort和$limit时,Mongo聚合速度变慢
我注意到,至少在概念上,在看起来相同的集合中存在巨大的性能差异。测试是在一个简单的集合结构上进行的,该集合结构有一个_id、一个名称和一个createdAt,但其中有2000万个。createdAt上有一个索引。它托管在mlab集群上,版本为3.6.9 WiredTiger 我正在尝试使用聚合实现一个简单的分页,我知道我可以使用find和limit,但我喜欢向管道添加更多元素,我给出的示例非常精练Database 在$facet中使用$sort和$limit时,Mongo聚合速度变慢,database,mongodb,performance,wiredtiger,Database,Mongodb,Performance,Wiredtiger,我注意到,至少在概念上,在看起来相同的集合中存在巨大的性能差异。测试是在一个简单的集合结构上进行的,该集合结构有一个_id、一个名称和一个createdAt,但其中有2000万个。createdAt上有一个索引。它托管在mlab集群上,版本为3.6.9 WiredTiger 我正在尝试使用聚合实现一个简单的分页,我知道我可以使用find和limit,但我喜欢向管道添加更多元素,我给出的示例非常精练 db.getCollection(“runnablecall”).aggregate([ { $f
db.getCollection(“runnablecall”).aggregate([
{
$facet:{
文件:[
{$sort:{createdAt:-1}},
{$限额:25},
{$skip:0},
],
页面信息:[
{$group:{{u id:null,总计:{$sum:1}}
}
],
}
}
])
这几乎需要40秒。现在,如果我将$sort
和$limit
移动到刻面之外,则需要0.042s
db.getCollection(“runnablecall”).aggregate([
{$sort:{createdAt:-1}},
{$限额:25},
{
$facet:{
文件:[
{$skip:0},
],
页面信息:[
{
$group:{u id:null,总计:{$sum:1}
}
]}
},
])
最后,
page\u info
facet没有任何区别,我可以毫无区别地取出它,我只是把它留在里面,因为我喜欢使用它。我知道如何使用两个查询来解决这个问题,一个是计数,一个是聚合,没有$facet
。我只是想理解为什么会发生这种情况。第一次聚合没有使用索引。第二个聚合使用索引并过滤前25个文档,然后再进入$facet
。您可以添加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 } }
}
],
}
}
])
你是说$facet没有使用索引吗?我只是不明白为什么会这样?