Skip to content

主流 KV 数据库的读写性能对比

约 528 字大约 2 分钟

NoSQL性能

2023-05-05

批量读写测试结果

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

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


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

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

贡献者

更新日志

2025/2/24 09:08
查看所有更新日志
  • 1ca4c-improve(docs): use chinese punctuation
  • c2111-modify(docs): remanage folders and rename files
  • 96e66-docs: update docs
  • 8224a-整理文章
  • 978a9-整理文章格式
  • f86ee-update
  • 93933-新增文字+CRLF全部替换为LF
  • 5ada9-升级主题+规整文章格式
  • 179ac-给予文件夹顺序
  • 00fb9-调整博客分类+修改about-me.md

Keep It Simple