【问题标题】:Mongo bulk replace with 200k+ operationsMongodb 批量替换 200k+ 操作
【发布时间】:2021-05-07 22:16:22
【问题描述】:

例如我的收藏中有这样的文件:

{
    "key": "key1",
    "time": 1000,
    "values": [] // this one is optional
}

我需要通过修改或删除values 列以及keytime 是过滤器来更新来自CSV 文件的集合。

到目前为止我已经尝试过:

  • DeleteMany(带有 or(and(key: key1), and(time: time2)),... 276k 更多 or 参数)+ InsertMany 带有 276k 文档 => ~ 90 秒
  • 使用 (filter: and(key: key1, time: time2)) 批量替换一个 => ~ 40 秒
  • 将大批量拆分成几个较小的批次(7500 似乎是性能最高的),但这一个在数据库操作方面不是原子的 => ~ 35 秒

注意事项:

  • 所有测试均使用bulk.ordered = false 进行,以提高性能。
  • 有唯一索引key: 1, time: -1

是否有可能优化此类请求?我知道 Mongo 可以爆发到大约 80k 插入/秒,但是替换呢?

【问题讨论】:

  • 你有什么问题?
  • @D.SM 抱歉,困了)更新问题

标签: mongodb mongo-java-driver mongo-scala-driver reactive-mongo-java


【解决方案1】:

批量操作不像提交的组那样是原子的。只有个别操作是原子的。另请注意,如果您提交的数量超过一定数量(未使用加密时为 1,000),驱动程序会自动将批量操作拆分为更小的批次,这就是为什么大批量的性能往往比低于 1000 的批次更差。

回答您关于性能的问题:

  • 使用 tmpfs 创建测试部署进行存储。
  • 了解此部署每秒可以维持多少查询。
  • 了解此部署每秒可以维持多少更新。
  • 如果每秒更新次数约为每秒查询次数的一半,则您可能正在以最高效率运行。

使用 SSD 和磁盘后备存储自然会降低性能。内存测试的目的是确保您尽可能高效地使用数据库。

特别是在读写混合工作负载的情况下,如果您使用的是磁盘,则切换到 SSD 存储应该会产生显着的性能提升。

【讨论】:

  • 1) 感谢您的建议。 2)将尝试并做出回应。 3) 从 MongoDB 3.6 开始,单个批量 limit value is 100,000
  • 为什么? The doc clearly says:在 3.6 版中更改:限制从 1,000 次写入提高到 100,000 次写入。此限制也适用于旧版 OP_INSERT 消息。
  • 我可以看到 Java 驱动程序在com.mongodb.internal.connection.MessageSettings.DEFAULT_MAX_BATCH_COUNT 中默认为 1000,但它可以被覆盖
  • 驱动程序创建对服务器的请求。服务器的上限不会起作用。
猜你喜欢
  • 2015-02-09
  • 2015-10-21
  • 2020-11-24
  • 2014-12-31
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多