Java 使用upsert,Mongodb性能会随着时间的推移而显著下降。
我现在正在使用Mongodb作为缓存。该应用程序将在夜间提供3个CSV,CSV将变得更大,因为新产品将不断添加。现在,我有500万条记录,处理每件事大约花了2个小时。由于缓存每天都刷新,因此刷新数据变得不切实际 比如说Java 使用upsert,Mongodb性能会随着时间的推移而显著下降。,java,mongodb,csv,data-migration,Java,Mongodb,Csv,Data Migration,我现在正在使用Mongodb作为缓存。该应用程序将在夜间提供3个CSV,CSV将变得更大,因为新产品将不断添加。现在,我有500万条记录,处理每件事大约花了2个小时。由于缓存每天都刷新,因此刷新数据变得不切实际 比如说 CSV 1 ID, NAME 1, NAME! CSV 2 ID, DESCRIPTION 1, DESC CSV 3 ID, SOMETHING_ELSE 1, SOMETHING_ELSE 应用程序将读取CSV1并将其放入数据库中。然后,如果有新信息,将读取CSV 2,
CSV 1
ID, NAME
1, NAME!
CSV 2
ID, DESCRIPTION
1, DESC
CSV 3
ID, SOMETHING_ELSE
1, SOMETHING_ELSE
应用程序将读取CSV1并将其放入数据库中。然后,如果有新信息,将读取CSV 2,并将其添加到同一文档或创建新记录。同样的逻辑也适用于CSV 3。因此,一个文档将从不同的CSV获得不同的属性,因此,upsert
。完成所有操作后,所有文档都将成为索引
目前,前100万个文档的速度相对较快,但我可以看到随着时间的推移,性能会大幅下降。我猜这是因为upsert,因为Mongodb必须找到文档并更新属性,否则就创建它。我正在使用Java驱动程序和MongoDB 2.4。在mongodb java驱动程序中,是否有任何地方我可以改进甚至批量升级 你所说的“一切完成后,所有文档都将被索引”是什么意思? 如果这是因为您想添加额外的索引,那么在最后添加索引是有争议的,但这很好。 如果您完全没有索引,那么这可能是您的问题 您希望确保正在执行的所有插入/追加操作都使用索引。您可以运行一个命令并使用.explain()查看索引是否得到了适当的使用。 您需要索引,否则每次插入/更新都要扫描100万个文档 另外,你能提供更多关于你的申请的细节吗