db.collection.insert vs db.collection.insertOne 和 db.collection.insertMany 的性能影响



我正在为NodeJs使用mongodb驱动程序,其中有3种方法:

1) 数据库集合插入

2) db.collection.insertOne

3) db.collection.insertMany

我发现db.collection.insert同时完成insertOne和insertMany的工作。

我也发现了相同的方法删除&更新。

相对于db.collection.insertOne&db.collection.insert有很多方法?

可以肯定的是,我正在一个收藏中工作,在某个时候会有一百万条记录。

有一些细微的差异:

  • db.collection.explain()不适用于insertOne()或insertMany(),但适用于insert()
  • insertMany()和insert()可以是有序的(默认)也可以是无序的。在后一种情况下,由于性能原因,mongo可能会执行重新排序
  • insert()返回WriteResult文档,而不是状态文档(包含新的objectId)

所以这取决于您选择的访问模式。通常,为了提高性能,如果必须添加多个文档,请尝试只调用1个(insert()或insertMany()),并使其无序(如果从应用程序的角度来看可能的话)。如果问题是你应该使用(insert()还是insertMany(),这取决于你是否需要explain()或产生的objectId,但在性能方面没有区别(如果你键入:db.yourCollection.insertdb.yourCollection.insertMany(没有()),你会发现两者都执行bulk.insert(obj))

TL;DR:

  • 插入1个文档:insertOne()或insert()
  • 插入n个文档:insertMany()或insert()
  • 插入文档无序:insertMany()或insert()+有序:false
  • 您需要ObjectId的操作状态:insertOne()或insertMany()
  • 您需要WriteResult:insert()
  • 您需要explain():insert()

在我的测试中,insert_one()insert_many()的性能相差10倍

我使用的是Python 3.9和MongoDB 5.0,我将~5M行/~500MB的CSV文件的每一行作为一个文档插入MongoDB集合中。它产生了一个4.8GB的集合,根据MongoDB Compass的报告,每个文档大约有1KB。

花了:

  • 3048s带insert_one()
  • 301个insert_many(),批次为1000行
  • 291个insert_many(),批次为5000行
  • 273s,insert_many(),批量10000行

性能测试

  • 3.7k x 50000数据
  • 尝试考虑相同的条件
  • Meteor驱动程序封装光纤的节点驱动程序以编写代码

节点驱动程序测试

  • 节点驱动程序insertMany with async+Promise sync:10~11秒
  • 节点驱动程序insertMany with async:13 ~ 15秒
  • 异步节点驱动程序插入:20~23秒

流星驱动器测试

  • 带异步的Meteor驱动程序插入:24~27秒
  • 带同步的Meteor驱动程序插入:43-49秒

结论

  • insertMany比insert快得多
  • Promise+await比async快
    • 无法解释。有什么想法吗
  • 批量插入的Meteor同步功能较慢

在对30个文档执行操作时,使用insert/update和many选项更有效,如:

  1. 有一个对服务器的调用
  2. 服务器引擎进程在不等待新数据的情况下工作

因此,减少往返、网络开销并允许数据库引擎一次处理所有文档,与通过客户端上的所有文档逐个调用插入/更新进行循环相比,具有列出的优势

最新更新