与批量写入一起使用批量写入时,Mongo的性能下降

问题描述 投票:0回答:1

我正在使用Mongo Java驱动程序3.11.1和Mongo 4.2.0版进行开发。我仍在学习mongo。我的应用程序接收到数据,因此必须插入或替换现有文档,即进行更新。

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

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字段上创建了索引,但导致性能差异小于2毫秒。-使用W1的writeConcern进行了尝试,但是性能仍然相同。

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

c)是否可以使用任何方法来解决这种情况。

mongodb performance upsert mongo-java mongo-java-driver
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.