Skip to content

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

535字约2分钟

NoSQL性能

2023-05-05

批量读写测试结果

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

LMDBBoltDBLevelDB测试方法
实现原理B+ 树B+ 树LSM 树
实现语言CGoC
包是否有文档有, 但较为简略齐全齐全
纯写时间1.28055064 s6.70166217 s1.071855718 s准备 50 万对 k,v, 分为 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 对 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/ ↩︎

变更历史

最后更新于: 查看全部变更历史
  • docs: update docs

    于 2024/11/19
  • 整理文章

    于 2024/11/5
  • 整理文章格式

    于 2024/10/29
  • update

    于 2024/10/17
  • 新增文字+CRLF全部替换为LF

    于 2024/10/17
  • 升级主题+规整文章格式

    于 2024/10/15
  • 给予文件夹顺序

    于 2024/9/24
  • 调整博客分类+修改about-me.md

    于 2024/9/24
  • 增加RepoCard

    于 2024/9/23
  • first commit

    于 2024/9/20

Keep It Simple