【问题标题】:Bulk upsert optimization mongoDB批量 upsert 优化 mongoDB
【发布时间】:2021-01-07 17:14:02
【问题描述】:

我有一个包含大约 50 000 个条目的集合,其中包含一些字段。

它们两者的组合是uniq(一个ObjectID和一个字符串)。

我需要大约 15 秒来更新 500 个条目。有没有办法更快地完成它? 我尝试在使用nestJS 的集合上使用bulkWrite(带有ordered:false)而不是多个updateOne(),但没有任何收获。

myObjects.forEach(objects => {
const upsertDoc = {
      updateOne: {
           filter: { someOid: myOid, someString: myString },
           update: { $set: myObject },
           upsert: true,
      },
};
bulkOps.push(upsertDoc);
}

myModel.collection.bulkWrite(bulkOps, { ordered: false });

我尝试使用空集合,它的速度更快(200 毫秒),我猜这是过滤器部分花费的时间太长。

【问题讨论】:

  • upserting时判断数据库是cpu绑定还是磁盘绑定。
  • explain检查一次updateOne调用。
  • 也许你的.forEach() 是慢的部分,而不是批量更新。
  • 图表显示 mongoDB 既不受 CPU 限制,也不受磁盘限制,对于每个,它在不到一秒的时间内完成,mongoDB 日志每次批量更新大约需要 14500 秒
  • 我们能看到那个日志条目吗?

标签: mongodb mongoose nestjs bulk


【解决方案1】:

我找到的解决方案是搜索不超过两个字段,而只搜索一个(在 ma 的情况下只是 _id),这大大提高了性能

【讨论】:

    猜你喜欢
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2012-02-06
    • 1970-01-01
    相关资源
    最近更新 更多