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