Java 使用upsert,Mongodb性能会随着时间的推移而显著下降。

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,

我现在正在使用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 3。因此,一个文档将从不同的CSV获得不同的属性,因此,
upsert
。完成所有操作后,所有文档都将成为索引


目前,前100万个文档的速度相对较快,但我可以看到随着时间的推移,性能会大幅下降。我猜这是因为upsert,因为Mongodb必须找到文档并更新属性,否则就创建它。我正在使用Java驱动程序和MongoDB 2.4。在mongodb java驱动程序中,是否有任何地方我可以改进甚至批量升级

你所说的“一切完成后,所有文档都将被索引”是什么意思? 如果这是因为您想添加额外的索引,那么在最后添加索引是有争议的,但这很好。 如果您完全没有索引,那么这可能是您的问题

您希望确保正在执行的所有插入/追加操作都使用索引。您可以运行一个命令并使用.explain()查看索引是否得到了适当的使用。 您需要索引,否则每次插入/更新都要扫描100万个文档

另外,你能提供更多关于你的申请的细节吗

  • 您是要在3个阶段只导入一次,还是要频繁更新
  • CSV2和CSV3是否修改了大部分文档
  • CSV2和CSV3的修改是否添加或替换了文档
  • 您的文档的平均大小是多少
  • 假设您多次对同一文档进行大量更新。例如,CSV2和CSV3对相同的文档进行了更新。您可能只想将文档保存在应用程序的内存中,在内存中应用所有更新,然后将文档推送到数据库中,而不是导入CSV1,然后更新CSV2,再更新CSV3。这假设您有足够的RAM来执行操作,否则您将再次使用磁盘