主流 KV 数据库的读写性能对比
批量读写测试结果
本次测试环境为 Linux 环境, 测试语言为 Go. 主要测试批量读写性能.
LMDB | BoltDB | LevelDB | 测试方法 | |
---|---|---|---|---|
实现原理 | B+ 树 | B+ 树 | LSM 树 | |
实现语言 | C | Go | C | |
包是否有文档 | 有, 但较为简略 | 齐全 | 齐全 | |
纯写时间 | 1.28055064 s | 6.70166217 s | 1.071855718 s | 准备 50 万对 k,v, 分为 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 对 kv, 然后再开启一个写进程, 三个读进程同时对该 db 文件操作. 读写均为 5000 对 kv. |
总结
- LMDB 更注重基础的性能, 使用C来实现, 但是封装的内部会允许一些危险的操作.[1]
- BoltDB 是从 LMDB 原先的接口演变而来, 基本上就是 LMDB 的 Go 版本实现. 但是比起性能更注重本身的操作简单易懂
- LevelDB 的实现原理是 LSM-tree, 导致他放弃读的一部分性能来支持写. 但是磁盘占用的最少. [2]
此处附上一个我自己封装的 Go 语言的 lmdb 操作接口, 仅供参考.