sY.zhang.
笔记
Database 1 分钟

B-Tree vs LSM-Tree:写多读少场景的索引选择

传统 B-Tree 适合读多写少,LSM-Tree 适合写多读少。但实际选择没那么简单。

B-Tree

  • 写:原位更新,要写 WAL + 改 page
  • 读:一次 B+ 树查找,O(log n)
  • 空间:稳定,无放大

适合:OLTP、点查为主、读多写少

LSM-Tree

  • 写:append 到 memtable,后台 compaction 合并
  • 读:要查 memtable + 多层 SSTable,需要 Bloom filter 加速
  • 空间:有写放大和空间放大

适合:写多读少、时间序列、日志

不是简单二选一

  • LSM 的读放大在小数据集不明显,大数据集要靠 Bloom filter + cache
  • B-Tree 写放大其实也不小(WAL + double write)
  • 真实场景里大多混合,要看模式分布

工程选择参考

场景 推荐
OLTP(交易型) B-Tree (PostgreSQL, MySQL)
时间序列 LSM (Cassandra, InfluxDB)
搜索引擎 倒排索引
嵌入式 LSM (RocksDB, LevelDB)

PostgreSQL 永远不会换成 LSM —— 它的优势就在 B-Tree 的查询稳定性上。