【问题标题】:Performance degrade with Mongo when using bulkwrite with upsert使用带有 upsert 的 bulkwrite 时,Mongo 的性能会下降
【发布时间】:2019-11-26 09:26:54
【问题描述】:

我正在使用 Mongo java driver 3.11.1 和 Mongo Version 4.2.0 进行开发。我还在学习 mongo。我的应用程序接收数据并且必须插入或替换现有文档,即执行 upsert。

截至目前,每个文档的大小为 780-1000 字节,每个集合可以有超过 300 万条记录。 方法 1:我尝试对每个文档使用 findOneandreplace,保存数据的时间超过 15 分钟。 方法 2 我使用下面的方法将其更改为 bulkwrite,这导致保存 20000 条记录大约需要 6-7 分钟。

List<Data> dataList;
dataList.forEach(data-> {
    Document updatedDocument = new Document(data.getFields());
    updates.add(new ReplaceOneModel(eq("DataId", data.getId()), updatedDocument, updateOptions));

  });
final BulkWriteResult bulkWriteResult = mongoCollection.bulkWrite(updates);

3) 我尝试使用 collection.insertMany,它需要 2 秒来存储数据。 根据驱动程序代码,insertMany 也在内部 InsertMany 使用 MixedBulkWriteOperation 来插入类似于 bulkWrite 的数据。

我的查询是 -

a) 我必须进行 upsert 操作,请让我知道我在哪里做错了。 - 在 DataId 字段上创建索引,但在性能方面导致

b) 为什么 insertMany 的性能比批量写入快。我可以理解几秒钟的差异,但无法弄清楚 insertMany 2-3 秒和 bulkwrite 5-7 分钟的原因。

c) 有什么方法可以用来解决这种情况。

【问题讨论】:

    标签: mongodb performance upsert mongo-java mongo-java-driver


    【解决方案1】:

    通过在DataId 字段上添加索引,这个问题得到更大程度的解决。以前我在 DataId 字段上创建了索引,但在创建集合后忘记创建索引。 此链接How to improve MongoDB insert performance 帮助解决了问题

    【讨论】:

      猜你喜欢
      • 2021-07-06
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多