主流 KV 数据库的读写性能对比
批量读写测试结果
本次测试环境为 Linux 环境,测试语言为 Go。 主要测试批量读写性能。
LMDB | BoltDB | LevelDB | 测试方法 | |
---|---|---|---|---|
实现原理 | B+ 树 | B+ 树 | LSM 树 | |
实现语言 | C | Go | C | |
包是否有文档 | 有,但较为简略 | 齐全 | 齐全 | |
纯写时间 | 1.28055064 s | 6.70166217 s | 1.071855718 s | 准备 50 万对键值对, 分为 10 组。每组 5 万对。每写完一组,就创建一个新的 db,共 10 个 db,以此模拟我们的分页。 |
纯读时间 | 438.873967 ms | 691.370612 ms | 3.377342491 s | 纯读就是把 10 个 db 中所有的 key 都查询一遍。 |
磁盘文件大小 | 3.6 M data + 8 K lock | 4 M data | 370 K data + 1.1 K log | |
一写三读 | 纯写:25.037765 ms 读写并发的写:24.810815 ms 读写并发的读:5.980233 ms,5.714387 ms,5.980233 ms。 | 纯写:51.295675 ms 读写并发的写:90.847912 ms 读写并发的读:5.869294 ms,56.966487 ms,107.594634 ms。 | 未成功。报错 resource temporarily unavailable 。 | 向同一个 db 中先写入 500 对键值对,然后再开启一个写进程,三个读进程同时对该 db 文件操作。读写均为 5000 对 kv。 |
总结
- LMDB 更注重基础的性能,使用 C 来实现,但是封装的内部会允许一些危险的操作。[1]
- BoltDB 是从 LMDB 原先的接口演变而来,基本上就是 LMDB 的 Go 版本实现。但是比起性能更注重本身的操作简单易懂。
- LevelDB 的实现原理是 LSM-tree,导致他放弃读的一部分性能来支持写。但是磁盘占用的最少。 [2]
此处附上一个我自己封装的 Go 语言的 lmdb 操作接口,仅供参考。
贡献者
更新日志
2025/2/24 09:08
查看所有更新日志