我正在使用mongo java driver 3.11.1和Mongo版本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字段上创建了索引,但性能差异小于2毫秒。-尝试使用W1的writeConcern,但性能仍然不变。
b)为什么insertMany的性能比批量写入更快。我可以理解几秒钟的差异,但是我不能找出insertMany的2-3秒和批量写入的5-7分钟的原因。
c)有没有什么方法可以解决这种情况。
发布于 2019-12-17 13:00:05
通过在DataId字段上添加索引,在更大程度上解决了这个问题。以前我在DataId字段上创建了索引,但在创建集合后忘记了创建索引。这个链接How to improve MongoDB insert performance帮助解决了这个问题
https://stackoverflow.com/questions/59047632
复制相似问题