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

时间:2014-01-15 16:01:27

标签: 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

应用程序将读取CSV 1并将其放入数据库中。然后,如果有新信息将其添加到同一文档或创建新记录,则将读取CSV 2。同样的逻辑适用于CSV 3.因此,一个文档将从不同的CSV获得不同的属性,因此upsert。一切都完成后,所有文件都将成为索引。

目前前100万份文件相对较快,但我可以看到性能随着时间的推移而大幅下降。我猜这是因为Mongodb必须找到文档并更新属性,否则创建它。我正在使用Java Driver和MongoDB 2.4。无论如何,我可以改进甚至在mongodb java驱动程序中批量upsert?

1 个答案:

答案 0 :(得分:1)

你的意思是'一切都完成后,所有的文件都会被编入索引'? 如果是因为你想添加额外的索引,那么在最后做这件事是有争议的,但是没关系。 如果你绝对没有索引,那么这可能是你的问题。

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

另外,您是否还可以提供有关申请的更多详细信息?

  1. 你打算只分三个阶段进行一次导入,还是经常更新?
  2. CSV2和CSV3会修改大部分文档吗?
  3. 对CSV2和CSV3进行修改是否添加或替换文档?
  4. 文档的平均大小是多少?
  5. 假设您多次对同一文档进行大量更新。例如,CSV2和CSV3在相同文档上有更新。而不是导入CSV1,然后对CSV2进行更新,然后对CSV3进行另一组更新,您可能只想将文档保存在应用程序的内存中,将所有更新应用到内存中,然后将文档推送到数据库中。这假设您有足够的RAM来执行操作,否则您将再次使用该磁盘。