当将批量写入与更新插入一起使用时,Mongo 的性能会下降



我正在使用Mongo java驱动程序3.11.1和Mongo版本4.2.0进行开发。我还在学习蒙戈。我的应用程序接收数据,必须插入或替换现有文档,即执行更新插入。

截至目前,每个文档大小为 780-1000 字节,每个集合可以有超过 300 万条记录。 方法1:我尝试为每个文档使用findOneandreplace 保存数据,保存数据需要超过15分钟。 方法-2 我使用下面将其更改为批量写入,这导致 ~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 也在内部插入许多使用 MixedBulkWriteOperation 来插入类似于 bulkWrite 的数据。

我的查询是 -

a( 我必须做更新插入操作,请让我知道我在哪里做任何错误。 - 在 DataId 字段上创建了索引,但在性能方面导致 <2 毫秒的差异。 - 尝试使用W1的writeConcern,但性能仍然相同。

b( 为什么 insertMany 的性能比批量写入更快。我可以理解几秒钟的差异,但无法找出插入 2-3 秒和批量写入 5-7 分钟的原因。

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

通过在 DataId 字段上添加索引,这个问题得到了更大程度的解决。以前我在 DataId 字段上创建了索引,但在创建集合后忘记创建索引。 此链接如何提高MongoDB插入性能有助于解决问题

最新更新