1. LSM-Tree 与 B-Tree 的存储模型差异,写放大、读放大、空间放大的工程取舍与典型引擎(RocksDB vs InnoDB)?
请说明 LSM-Tree 与 B-Tree 的存储模型差异,以及写放大、读放大、空间放大的工程取舍,并对比 RocksDB 与 InnoDB 这类典型引擎?
- LSM 顺序写+合并 vs B-Tree 原地更新+页分裂
- 写放大、读放大、空间放大三种放大效应的定义与权衡
- RocksDB 与 InnoDB 在各自场景下的取舍
B-Tree 采用原地更新,数据按 key 有序存放于页,点查定位快、读放大低,但随机写入会触发页的分裂/合并和写盘,写放大较高;由于 B-Tree 页可能需要多次读(根到叶),随机点查读放大一般为 1(索引深度)到几倍。LSM-Tree 把写入先追加到内存中的 MemTable,再以有序的 SSTable 批量落盘,通过后台 Compaction 合并,因此写入是顺序写、写放大低,但读需要从多层 SSTable 中查找、可能多次读,读放大较高;多次 Compaction 还会带来空间放大(暂时存在多份数据)。因此在写密集、追加型负载下 LSM 更优,在读密集/点查负载下 B-Tree 更优。工程取舍常体现在 RocksDB(LSM,适合存储引擎底座、写多读少)与 InnoDB(B+Tree,作为 OLTP 关系库的核心,读一致性好、支持事务)的对比上。
三种放大的本质是"用哪种资源换性能":LSM 用读放大和空间放大换低写放大,B-Tree 用写放大换低读放大;二选一取决于负载是写密集还是读密集。