传统 MySQL InnoDB 用 B+Tree,随机写会有明显写放大。OceanBase 的存储引擎走的是 LSM-Tree(日志结构合并树) 路线,核心就三步:
- 写路径:先写预写日志 Clog(保持久化),再写内存 MemTable,内存写满就**转储(Minor Freeze)**成 SSTable 顺序落盘——全是顺序写,所以写入吞吐高。
- 读路径:先查 MemTable,再逐层查增量/基线 SSTable,靠 Block Cache / Row Cache / Bloom Filter 做加速,避免每次都去磁盘多路归并。
- 每日合并(Major Compaction):转储攒多了读会变慢,OceanBase 会在业务低峰(一般凌晨)把基线 SSTable + 增量转储数据合并成新基线,顺手回收空间、清理过期版本,读性能回血。
简单对比:LSM-Tree 用"写放大换读放大"的思路,把随机写转成顺序写;InnoDB 则是点查快、随机写压力大。
抛个问题引互动:从 InnoDB 迁移到 OB 的同学,最不习惯的点是啥?转储/合并的时机你们是自动还是手动控?