LMDB的内部设计有什么特别之处?

时间:2016-02-08 21:32:58

标签: lmdb

内存中的B-Tree(例如google btree)和LMDB的某些C ++实现之间的性能差异(读/写)是什么(不考虑LMDB的所有功能,如事务,隔离,共享访问等。)?

1 个答案:

答案 0 :(得分:5)

其架构师 Howard Chu 2014 lmdb design presentation涵盖了lmdb的设计和权衡。

总结一下:lmdb是一个写时复制,自下而上更新,双缓冲的b-tree,只要与其他注意事项发生冲突,实现总是倾向于简单。

智能设计选择 使其成为最高性能和抗腐败的B树实施之一。

  • copy-on-write意味着数据永远不会被覆盖,避免了许多可能的损坏情况
  • 从leaf到root的自下而上更新使根更新等同于提交
  • 过去版本的双缓冲仅保留db文件中的最后两个根
  • 避免了复杂的多级缓存方案 - lmdb依赖底层操作系统进行缓存
  • 与避免CPU缓存未命中的其他DB相比,整个代码库非常小

显然,这些选择意味着lmdb对复杂情况不友好,例如:

  • 多版本数据库回滚(只有最后2个可用)
  • 长期事务和延迟提交:这些会导致仅附加行为并且可能无限制地增长db文件
  • 多个并发编写器:lmdb支持更简单的多个读者和单个编写器方案

完整(超过100页)的演示文稿还有更多内容。以上只是lmdb精神的总结。

lmdb被用作突出的开源项目(如Open LDAP和Memcached)中的核心存储引擎,并且在两种情况下都观察到了与替代方案相比的数量级加速,如{{{ 3}}