0

例如,我在集合中有这样的文件:

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

我需要通过修改或删除values列以及其中key&time是过滤器来更新来自 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 插入/秒,但是替换呢?

4

1 回答 1

0

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

要回答您关于性能的问题:

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

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

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

于 2021-02-04T23:48:37.747 回答