Skip to content

主流K-V数据库读写性能对比

516字约2分钟

NoSQL性能

2023-05-05

批量读写测试结果

本次测试环境为Linux环境, 测试语言为Go. 主要测试批量读写性能.

LMDBBoltDBLevelDB测试方法
实现原理B+树B+树LSM树
实现语言CGoC
包是否有文档有, 但较为简略齐全齐全
纯写时间1.28055064s6.70166217s1.071855718s准备50万对k,v, 分为10组, 每组5万对. 每写完一组, 就创建一个新的db, 共10个db, 以此模拟我们的分页.
纯读时间438.873967ms691.370612ms3.377342491s纯读就是把10个db中所有的k都查询一遍.
磁盘文件大小3.6M data + 8K lock4M data370K 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操作接口, 仅供参考.


  1. benchmarking-leveldb-vs-rocksdb-vs-hyperleveldb-vs-lmdb-performance-for-influxdb ↩︎

  2. mozilla.github.io/firefox-browser-architecture/ ↩︎