内存中 B-Tree(例如 google btree)和 LMDB 的某些 C++ 实现(不考虑 LMDB 的所有功能,例如事务、隔离、共享访问等)之间的性能差异(读/写)是什么? .)?
问问题
2848 次
1 回答
12
2014年lmdb的架构师Howard Chu设计演示涵盖了lmdb
.
总结一下:lmdb
是一种写时复制、自下而上更新、双缓冲、b-tree,当它与其他考虑因素发生冲突时,它的实现总是倾向于简单。
明智的设计选择使其成为目前性能最高且抗损坏的 B-tree 实现之一。
- 写时复制意味着永远不会覆盖数据,避免了许多可能的损坏情况
- 从叶子到根的自下而上更新使根更新等同于提交
- 过去版本的双缓冲仅保留 db 文件中的最后两个根
- 避免了复杂的多级缓存方案——
lmdb
依赖底层操作系统进行缓存 - 与避免 CPU 缓存未命中的其他数据库相比,整个代码库非常小
显然,这些选择意味着lmdb
对复杂场景不友好,例如:
- 多版本数据库回滚(仅最后 2 个可用)
- 长期事务和延迟提交:这些导致仅附加行为和 db 文件可能无限增长
- 多个并发写入者:
lmdb
倾向于更简单的多个读取器和单个写入器方案
完整的(超过 100 页)演示文稿中还有更多内容。以上只是对精神的总结lmdb
。
lmdb
被用作 Open LDAP 和 Memcached 等著名开源项目的核心存储引擎,在 微基准测试结果中可以看到,与替代方案相比,在这两种情况下都观察到了数量级的加速。
于 2016-03-01T20:18:13.563 回答