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

帕维可洛丁

内存B树(例如google btree)的某些C ++实现与LMDB(不考虑LMDB的所有功能,例如事务,隔离,共享访问等)之间的性能差异(读/写)将是多少? )?

阿里耶夫

2014 lmdb设计呈现由它的建筑师霍华德楚覆盖的设计和权衡lmdb

总结一下:lmdb是一种写时复制,自下而上更新,双缓冲,b树,其中,在与其他考虑因素冲突时,实现总是倾向于简化。

巧妙的设计选择,使其最高的性能和耐腐败-B树实现的一个在那里。

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

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

  • 多版本数据库回滚(仅最后2个可用)
  • 长期存在的事务和延迟的提交:这将导致仅附加行为,并可能无限扩展数据库文件
  • 多个并发作者:lmdb倾向于使用更简单的多个读取者和单个写入者方案

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

lmdb在诸如Open LDAP和Memcached之类的著名开源项目中,它被用作核心存储引擎,并且在这两种情况下,与替代方案相比,在微观基准测试结果中都可以观察到数量级的提升

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章