Mongodb Mongo$sort和$count在新版本中变得越来越糟糕

Mongodb Mongo$sort和$count在新版本中变得越来越糟糕,mongodb,aggregation-framework,Mongodb,Aggregation Framework,在将我的mongo服务器从3.4升级到4.2之后,一些使用$sort和$count的聚合现在执行起来非常慢。为了确保它与升级相关,我在本地安装了几个版本的Mongo,并在相同数量的数据上尝试了相同的聚合,结果如下: db.getCollection('devices').aggregate([ { $lookup: { from: "sites", localField: "_id", foreignField: "devices", as: "site" } }, { $unwind: {

在将我的mongo服务器从3.4升级到4.2之后,一些使用$sort和$count的聚合现在执行起来非常慢。为了确保它与升级相关,我在本地安装了几个版本的Mongo,并在相同数量的数据上尝试了相同的聚合,结果如下:

db.getCollection('devices').aggregate([
{ $lookup: { from: "sites", localField: "_id", foreignField: "devices", as: "site" } }, 
{ $unwind: { path: "$site", preserveNullAndEmptyArrays: true } },
{ $lookup: { from: "users", localField: "site._id", foreignField: "sites", as: "users" } },
{ $count: "count"}
])

Mongo version     Time
3.4            => 0.47s
3.6            => 0.632s
4.0            => 0.641s
4.2            => 2.98s
4.3.5          => 3.1s


db.getCollection('devices').aggregate([
{ $lookup: { from: "sites", localField: "_id", foreignField: "devices", as: "site" } },
{ $unwind: { path: "$site", preserveNullAndEmptyArrays: true } },
{ $lookup: { from: "users", localField: "site._id", foreignField: "sites", as: "users" } },
{ $sort: { _id: 1 } },
{ $skip: 0 },
{ $limit: 20 }
])

Mongo version     Time
3.4            => 0.476s
3.6            => 0.581s
4.0            => 0.669s
4.2            => 2.89s
4.3.5          => 3.24s
我对$lookup使用的每个字段都有索引 我知道$sort应该放在管道的第一个阶段以使用索引,但是由于这个查询是动态编写的,排序字段并不总是在_id上,可以是来自$lookup的字段之一,也可以在阶段之间动态添加$match,例如$match:{“users.type”:“customer”}

我真正的问题是“升级mongo怎么会让性能变得如此糟糕?我是不是错过了一些显而易见的东西?”


感谢您的帮助。

如果没有更多关于您的基准测试的详细信息,就不可能说是什么造成了所用时间的差异。运行时间是否包括驱动程序连接到数据库的时间

升级mongo怎么会让性能变得如此糟糕


一般来说,所有正在积极开发的软件都会不断增加新的功能,因此有理由预计,随着时间的推移,单个操作可能会变慢,因为它本身会做更多的工作来适应功能的增长,或者是因为系统中其他地方的功能增长导致了系统开销。

您是否尝试在这两个版本上运行查询计划?我刚刚在3.4和4.2版本上运行了explain()。结果与4.2中引入的“serverInfo”、“queryHash”和“planCacheKey”等新部分相同。我对所有mongo版本使用相同的方式运行robo3T中的聚合。一切都在本地运行。此外,这是生产数据的一个子集,当使用完整集合时,流程时间从3.4的几秒钟跳到4.2的2分钟以上。您可以通过对一个简单查询进行基准测试并确保其在大致相同的时间运行,在不同的服务器版本之间建立一致的基线,然后简化您关心的查询,以确定哪些部分导致了服务器版本之间的执行时间差异。是的,有问题的部分是$count和$sort,没有它们,聚合在不同版本之间花费的时间大致相同。我知道添加新功能可能会改变性能,但花2分钟计算聚集的~20k元素似乎真的很糟糕:-(我想如果你创建一个复制案例,其他人很容易运行并发布它,可能会有人对此进行调查。