分形树介绍
前言
分形树结合了B树和LSM树的优势。分形树背后的主要思想是在快速查找(如B树)和快速写入性能(如LSM树)之间保持最佳平衡。
分形树(Factal Tree Index)是一种用于数据库的索引结构,用于在磁盘上存储和管理数据。当它被用作RocksDB和TokuDB(被Percona收购)等数据库的存储算法时,它受到了关注。这些数据库使用分形树来实现高性能、可扩展的索引和存储大量数据。分形树算法旨在提供快速高效的索引、改进的压缩以及对范围查询和更新的支持。
引出分形树之前我们先了解3个问题
让我们理解三个概念,以便更好地理解这个话题。写入放大、空间放大和读取放大。
读取放大
读取放大是指执行特定查询所需的I/O操作数量。
空间放大
空间放大是指数据库存储数据所需的磁盘空间量与原始数据大小的增加。它可能由多种因素引起,例如碎片化、数据结构所需的开销、数据重复或导致存储使用增加的存储算法。例如,B树由于B树块内的碎片化,通常只能实现75%的空间利用率。因此,B树遭受了4/3的空间放大。
写入放大
写入放大是指存储设备上写入的数据量与应用程序写入的数据量之比。LSM树和分形树索引都比传统的B树提供了显著的优势。例如,如果数据库行包含100字节,而像InnoDB这样的B树使用16KiB的页面,则B树可能需要执行16KiB的I/O操作来写入单个100字节的行,写入放大为160,相比之下,其他数据结构的写入放大为30到70。
写入放大是机械硬盘和固态硬盘(SSD)上都存在的问题,但原因不同。对于SSD来说,写入放大是一个问题,因为基于闪存的SSD只能被写入有限次数。执行随机更新的B树很容易耗尽闪存。较低的写入放大可以帮助降低成本,因为你可以买到更便宜的闪存(写入周期更少),而且你可能能够分配更高比例的闪存存储来存储有用的数据,因为写入块更大。更大的写入块有助于SSD。
从B树和LSM树到分形树
总结一下问题,
B树在查找方面表现良好,但在插入方面表现不佳。
LSM树在插入方面表现良好,但在查找方面表现不佳。
是否存在一种数据结构,其查找性能与B树相当,但插入性能更接近LSM树或仅追加文件?
答案是分形树
分形树是怎么工作的
分形树结合了B树和LSM树的优势。分形树背后的主要思想是在快速查找(如B树)和快速写入性能(如LSM树)之间保持最佳平衡。
在分形树索引中,使用缓冲区临时存储更新和删除操作,然后最终将它们合并到主树结构中。缓冲区通过减少修改索引所需的磁盘I/O操作数量来帮助提高写入性能。缓冲区的内容会定期与主树合并,这个过程被称为“刷新”。通过使用缓冲区,分形树索引可以有效地平衡写入性能和索引大小之间的权衡,使它们非常适合用于高性能数据库系统。
它与B树非常相似,只是它有额外的缓冲区,这些缓冲区恰好是空的。当数据记录插入树中时,不是像B树那样遍历整个树,我们只是简单地将数据记录插入树根的缓冲区。
根缓冲区将被新数据记录填满。在这一点上,分形树索引会将插入的记录复制到树的下一级。
最终,新插入的记录将到达叶子,此时它们就像B树存储它们一样简单地存储在叶节点中。通过树的缓冲区下降的数据记录可以被看作是“插入此记录”的消息。分形树索引可以使用其他类型的消息,例如删除记录的消息或更新记录的消息。
分形树的优缺点
分形树的优点是什么
分形树结合了B树和LSM树的优势。分形树背后的主要思想是在快速查找(如B树)和快速写入性能(如LSM树)之间保持最佳平衡。
分形树的缺点是什么?
分形树和其他任何数据结构一样,都有其局限性和缺点。分形树的一些缺点包括:
- 复杂性:分形树是一种复杂的数据结构,与其他数据结构相比,可能需要更多的努力来实现和维护。
- 性能权衡:分形树在某些用例中可能提供改进的性能,但可能不是所有类型的工作负载的最佳选择。例如,它们可能不适合大型顺序扫描或写入密集型工作负载。 分形索引树没有通过利用大量顺序写入来实现
- 高写入吞吐量,并且不使用内存中索引。
- 技术较新资源较少:分形树是一种相对较新的数据结构,因此可能没有像B树这样更成熟的结构那样的支持和社区资源可用。
哪些数据库使用分形树?
分形树被用作数据库如RocksDB、TokuDB和PerconaFT的存储算法。这些数据库使用分形树来实现高性能、可扩展的索引和存储大量数据。分形树算法旨在提供快速高效的索引、改进的压缩以及对范围查询和更新的支持。