例如,我在集合中有这样的文档:
{
"key": "key1",
"time": 1000,
"values": [] // this one is optional
}
我需要通过修改或删除values
列来更新CSV文件中的集合,其中key
&CCD_ 3是滤波器。
到目前为止我尝试过的:
- DeleteMany(带有
or(and(key: key1), and(time: time2))
,…还有276k个or
参数)+InsertMany带有276k个文档=>~90秒 - 批量将One替换为(
filter: and(key: key1, time: time2)
)=>~40秒 - 将巨大的批量拆分为几个较小的批次(7500似乎是最具性能的),但就db操作而言,这一批次不是原子性的=>~35秒
备注:
- 所有测试都使用
bulk.ordered = false
来提高性能 - 存在唯一索引
key: 1, time: -1
是否有可能优化此类请求?我知道Mongo可以爆发到大约80k插入/秒,但替换呢?
批量操作不是提交组的原子操作。只有个别操作是原子操作。还要注意的是,如果您提交的批量操作超过一定数量(不使用加密时为1000),驱动程序会自动将批量操作拆分为较小的批次,这就是为什么大批量操作的性能往往比1000以下的批次差。
回答您的性能问题:
- 使用tmpfs为存储创建一个测试部署
- 了解此部署每秒可以支持多少查询
- 了解此部署每秒可以维持多少次更新
- 如果每秒更新的次数大约是每秒查询次数的一半,那么您可能正在以最大效率运行
使用SSD和磁盘备份存储,性能自然会降低。内存测试的目的是确保尽可能高效地使用数据库。
特别是在混合读写工作负载的情况下,如果您使用磁盘,切换到SSD存储应该会显著提高性能。