MongoDB更新操作性能

MongoDB更新操作性能,mongodb,performance,nosql,Mongodb,Performance,Nosql,当字段值设置为相同值时,更新查询性能会发生显著变化。MongoDB版本:4.2.6 运行1: 文件数量:100万份 更新1M文档所需时间:13m31.227s db.test.find().forEach(function(doc){db.test.update({_id:doc._id}, {$set:{counter: 400}})}) 运行2: 文件数量:100万份 更新1M文档所需时间:7m41.080s db.test.find().forEach(function(doc){db.

当字段值设置为相同值时,更新查询性能会发生显著变化。MongoDB版本:4.2.6

运行1:

文件数量:100万份

更新1M文档所需时间:13m31.227s

db.test.find().forEach(function(doc){db.test.update({_id:doc._id}, {$set:{counter: 400}})})
运行2:

文件数量:100万份

更新1M文档所需时间:7m41.080s

db.test.find().forEach(function(doc){db.test.update({_id:doc._id}, {$set:{counter: 400}})})
db.test.find().forEach(function(doc){db.test.update({_id:doc._id}, {$set:{counter: 400}})})
运行3:在mongod重新启动并手动清理buff/cache之后

文件数量:100万份

更新1M文档所需时间:7m41.080s

db.test.find().forEach(function(doc){db.test.update({_id:doc._id}, {$set:{counter: 400}})})
db.test.find().forEach(function(doc){db.test.update({_id:doc._id}, {$set:{counter: 400}})})
运行4:将计数器设置为新值

文件数量:100万份

更新1M文档所需时间:13m44.284s

db.test.find().forEach(function(doc){db.test.update({_id:doc._id}, {$set:{counter: 500}})})
运行5:

文件数量:100万份

更新1M文档所需时间:7m42.356s

db.test.find().forEach(function(doc){db.test.update({_id:doc._id}, {$set:{counter: 500}})})

mongodb在设置字段值时是否执行其他检查?对于相同的更新操作,什么会导致这样的性能差异?

当您第一次运行查询时,MongoDB(或任何其他DBMS)会为它制定查询计划并缓存它。因此,下次运行相同的查询时,MongoDB将使用该查询计划(除非已从缓存中清除)

此外,如果您对查询进行任何更改(即使是相同的模式(使用word),它仍然是一个没有缓存查询计划的新查询,因此MongoDB尝试创建查询计划并缓存它。 要测试这一点,您可以运行查询,然后使用以下命令清除缓存:

db.colllction_name.getPlanCache().clear()
再次运行您的查询,您将再次看到运行该查询需要更多的时间(可能与第一次运行相同)


此外,每次运行任何查询时,请使用
explain(“executionStats”)
并比较这些统计数据

是否也可以粘贴每次运行的计划缓存和查询计划?您可以使用
db.collection.explain()
获取查询计划和
db.collection.getPlanCache()
获取计划缓存但有一点很清楚,当您第一次运行查询时,mongodb会尝试创建查询计划并缓存它,因此每次更改它都会花费额外的时间。因为所有查询的查询模式都是相同的,所以mongodb将为第一次查询准备计划,并为n次后续调用缓存它。取~6选择计划不太可能需要几分钟。请注意,即使在服务器重新启动后,两个更新后操作也需要相同的时间。重新启动服务器会导致计划缓存刷新,但不会影响性能-运行2和运行3为什么不简单地使用
db.test.updateMany({},{$set:{counter:400})