B树和LSM树比较
-
读写速度
-
写:LSM树快,读慢是必须检查几种不同的数据结构和不同压缩(Compaction)层级的 SSTables
-
读:B树快
-
-
特点对比
-
写
-
B树
-
每块数据都必须至少写入两次:一次写入预先写入日志(WAL),一次写入树页面本身(如果有分页还需要再写入一次)
-
即使在该页面中只有几个字节发生了变化,也需要接受写入整个页面的开销。
-
写放大代价:存储引擎写入硬盘的次数越多,可用硬盘带宽内它能处理的每秒写入次数就越少
-
-
LSM树
-
通常能够比 B 树支持更高的写入吞吐量,部分原因是它们有时具有较低的写放大(尽管这取决于存储引擎的配置和工作负载),部分是因为它们顺序地写入紧凑的 SSTable 文件而不是必须覆写树中的几个页面
-
-
-
空间占用
-
LSM树
-
LSM 树可以被压缩得更好
-
LSM 树不是面向页面的,并且会通过定期重写 SSTables 以去除碎片,所以它们具有较低的存储开销,特别是当使用分层压缩(leveled compaction)
-
-
B树
-
碎片化(fragmentation)留下一些未使用的硬盘空间:当页面被拆分或某行不能放入现有页面时,页面中的某些空间仍未被使用
-
-
-
读写等业务操作
-
LSM树
-
压缩过程有时会干扰正在进行的读写操作
-
对吞吐量和平均响应时间的影响通常很小,但是日志结构化存储引擎在更高百分位的响应时间有时会相当长
-
-
B树
-
更具备可预测性,影响更小
-
-
-
高写入吞吐量场景
-
LSM树
-
数据库越大,压缩所需的硬盘带宽就越多.
-
写入吞吐量很高,并且压缩没有仔细配置好,有可能导致压缩跟不上写入速率
-
在这种情况下,硬盘上未合并段的数量不断增加,直到硬盘空间用完,读取速度也会减慢,因为它们需要检查更多的段文件。通常情况下,即使压缩无法跟上,基于 SSTable 的存储引擎也不会限制传入写入的速率
-
-
B树
-
每个键只存在于索引中的一个位置,而日志结构化的存储引擎可能在不同的段中有相同键的多个副本。这个方面使得 B 树在想要提供强大的事务语义的数据库中很有吸引力:在许多关系数据库中,事务隔离是通过在键范围上使用锁来实现的,在 B 树索引中,这些锁可以直接附加到树上
-
-
-