LMDB的内部设计有什么特别之处?
What is special about internal design of LMDB?
内存中 B 树(例如 google btree)的某些 C++ 实现与 LMDB(不考虑所有功能)之间的性能差异 (reads/writes) LMDB(例如事务、隔离、共享访问等)?
此 2014 lmdb design presentation 由其架构师 Howard Chu 撰写,涵盖了 lmdb
.
的设计和权衡
总而言之:lmdb
是一种写时复制、自下而上更新、双缓冲的 b 树,只要与其他考虑因素发生冲突,实现总是倾向于简单性。
智能设计选择 使其成为目前性能最高且抗损坏的 B 树实现之一。
- 写时复制意味着数据永远不会被覆盖,避免了许多可能的损坏情况
- 从叶到根的自下而上更新使根更新等同于提交
- 过去版本的双缓冲仅保留 db 文件中的最后两个根
- 避免了复杂的多级缓存方案 -
lmdb
依赖底层 OS 进行缓存
- 与其他 DB 相比,整个代码库非常小,避免了 CPU 缓存未命中
显然,这些选择意味着lmdb
对复杂场景不友好,例如:
- 多版本数据库回滚(只有最后两个可用)
- 长期事务和延迟提交:这些导致仅附加行为和数据库文件的潜在无限增长
- 多个并发写入器:
lmdb
支持更简单的多个读取器和单个写入器方案
完整(超过 100 页)的演示文稿中还有更多内容。以上只是lmdb
.
精神的总结
lmdb
被用作 Open LDAP 和 Memcached 等著名开源项目的核心存储引擎,在这两种情况下,与替代方案相比,都观察到了数量级的加速,如在micro-benchmark results.
内存中 B 树(例如 google btree)的某些 C++ 实现与 LMDB(不考虑所有功能)之间的性能差异 (reads/writes) LMDB(例如事务、隔离、共享访问等)?
此 2014 lmdb design presentation 由其架构师 Howard Chu 撰写,涵盖了 lmdb
.
总而言之:lmdb
是一种写时复制、自下而上更新、双缓冲的 b 树,只要与其他考虑因素发生冲突,实现总是倾向于简单性。
智能设计选择 使其成为目前性能最高且抗损坏的 B 树实现之一。
- 写时复制意味着数据永远不会被覆盖,避免了许多可能的损坏情况
- 从叶到根的自下而上更新使根更新等同于提交
- 过去版本的双缓冲仅保留 db 文件中的最后两个根
- 避免了复杂的多级缓存方案 -
lmdb
依赖底层 OS 进行缓存 - 与其他 DB 相比,整个代码库非常小,避免了 CPU 缓存未命中
显然,这些选择意味着lmdb
对复杂场景不友好,例如:
- 多版本数据库回滚(只有最后两个可用)
- 长期事务和延迟提交:这些导致仅附加行为和数据库文件的潜在无限增长
- 多个并发写入器:
lmdb
支持更简单的多个读取器和单个写入器方案
完整(超过 100 页)的演示文稿中还有更多内容。以上只是lmdb
.
lmdb
被用作 Open LDAP 和 Memcached 等著名开源项目的核心存储引擎,在这两种情况下,与替代方案相比,都观察到了数量级的加速,如在micro-benchmark results.