如何解决Mongo 批量替换为 20 万次以上的操作
例如我收藏中有这样的文档:
{
"key": "key1","time": 1000,"values": [] // this one is optional
}
我需要通过修改或删除 values
列以及其中 key
和 time
是过滤器来更新来自 CSV 文件的集合。
到目前为止我尝试过的:
- DeleteMany(with
or(and(key: key1),and(time: time2))
,... 276k moreor
arguments) + InsertMany with 276k 文档 => ~ 90 秒 - 用 (
filter: and(key: key1,time: time2)
) 批量替换一个 => ~ 40 秒 - 将大批量拆分成几个较小的批次(7500 似乎是性能最高的),但就数据库操作而言,这不是原子的 => ~ 35 秒
注意事项:
- 所有测试都使用
bulk.ordered = false
以提高性能。 - 有唯一索引
key: 1,time: -1
有没有可能优化这种请求?我知道 Mongo 可以达到约 8 万次插入/秒,但替换呢?
解决方法
批量操作不像提交的组那样是原子的。只有个别操作是原子的。另请注意,如果您提交的数量超过特定数量(未使用加密时为 1,000),驱动程序会自动将批量操作拆分为较小的批次,这就是为什么大批量的性能往往比小于 1000 的批次性能更差。
回答关于性能的问题:
- 使用 tmpfs 进行存储创建测试部署。
- 了解此部署每秒可以维持多少查询。
- 了解此部署每秒可以维持多少更新。
- 如果每秒更新数大约是每秒查询数的一半,则您的运行效率可能最高。
使用 SSD 和磁盘后备存储自然会降低性能。内存测试的目的是确保您尽可能高效地使用数据库。
特别是对于混合读写工作负载,如果您使用的是磁盘,切换到 SSD 存储应该会产生明显的性能提升。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。