java - 随着 upsert 的推移,Mongodb 性能会显着下降。

标签 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 万个文档相对较快,但我可以看到随着时间的推移,性能会大幅下降。我猜这是因为 upsert,因为 Mongodb 必须找到文档并更新属性,否则创建它。我正在使用 Java 驱动程序和 MongoDB 2.4。无论如何,我可以改进甚至在 mongodb java 驱动程序中进行批量更新插入吗?

最佳答案

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

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

此外,您能否提供有关您的申请的更多详细信息?

  1. 您打算分 3 个阶段仅导入一次,还是会频繁更新?
  2. CSV2 和 CSV3 是否会修改大部分文档?
  3. CSV2 和 CSV3 的修改是否会添加或替换文档?
  4. 您的文档的平均大小是多少?

假设您多次对同一文档进行大量更新。例如,CSV2 和 CSV3 对同一文档进行了更新。您可能只想将文档保留在应用程序的内存中,应用内存中的所有更新,然后将文档推送到数据库中,而不是导入 CSV1,然后更新 CSV2,然后更新 CSV3。假设您有足够的 RAM 来执行该操作,否则您将再次使用磁盘。

关于java - 随着 upsert 的推移,Mongodb 性能会显着下降。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21142217/

相关文章:

如果 ID 匹配,MySQL 查询将行显示为列

java - foreach 不适用于表达式类型

MongoDB ObjectId外键实现推荐

javascript - 当我的 Mongoose DB 模式之一的实例被放置在第二个模式中时,为什么它可能是 "cast to undefined"?

java - MongoDB 映射类

c++ - OpenCV:带有 CSV 文件的特征脸

java - 使 InputStream 成为非阻塞的

java - 实例化内部类

java - 不同地点环境下日期差异天数不同

linux - 如何使用sqlite命令导入大型CSV文件?