学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
Python实战微信订餐小程序 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
Python量化交易实战 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
作为目前数据库引擎的两种主要数据结构,LSM-tree和B±tree在业界已经有非常广泛的研究。相比B±tree,LSM-tree牺牲一定的读性能以换取更小的写放大以及更低的存储成本,但这必须建立在已有的HDD和SSD的基础上。
探索前沿研究,聚焦技术创新,本期DB·洞见由腾讯云数据库高级工程师王宏博进行分享,主要介绍一篇2022年FAST的论文,主题为“基于硬件透明压缩的B+树优化”。本次分享的论文针对可计算存储SSD(支持硬件透明压缩)提出了三种有趣的设计方法,从而极大地减少了B±tree的写放大(10X)以使其接近甚至超越LSM-tree。以下为分享实录:
完整视频:https://v.qq.com/x/page/p3342om19py.html
本期分享的是2022年FAST的一篇论文,主题是基于硬件透明压缩的B+树优化,该论文在内容上主要分为三个部分:
第一部分是背景介绍,作者分别介绍了现有的B+树及其软件压缩、存储硬件透明压缩、B+树和LSM-tree的简要对比以及B+树写放大的构成分析。
第二部分是算法部分,作者针对性地提出了三种设计来优化B+树的写放大:
确定性的page shadowing来解决页面原子写引入的写放大。
通过页面本地增量日志来减少刷脏页引入的写放大。
通过稀疏日志来减少redo日志引入的写放大。
第三部分是实验部分,作者通过前面所述的三个方法实现了一个新的B+树(我们称之为B−-tree为以示区别),并详细比较了多种条件下的测试结果。
2.1 现有的B+树及其软件压缩
我们熟悉的开源数据库有很多都使用B+树作为存储引擎,比如MySQL、MongoDB、PostgreSQL等,腾讯云数据库TDSQL-PG也是基于B+树来实现的。B+树的结构如下方的左图所示,它通过一个个的数据页面构成一个树状结构以提供索引加速数据查找。常见的数据页面大小有8k和16k,通过数据页面压缩可以减少B+树的空间占用以降低成本,此外还可以减少B+树的写放大。
在前面所提到的基于B+树实现的数据库中,MySQL、MongoDB都实现了B+树的软件压缩特性,TDSQL-PG的商业化版本也有实现。软件压缩具有不依赖于特定硬件、灵活性高的优点,但美中不足的是,受限于现有的IO 4K对齐的约束会产生一些额外的空间浪费。比如下方右图,一个16K的数据库页面经过压缩后产生了5K的数据。受限于IO 4K对齐的要求,当落盘时这5K的数据实际上要占用8K的空间,产生了额外的3K的空间浪费。
常见的B+树压缩算法有Lz4、zlib、ZSTD,后面所提的LBA则是指logical block adressing,即逻辑上的磁盘块大小。