列式存储 vs 行式存储
同样的数据,行式存储和列式存储的查询性能可以相差 100 倍。
这不是夸大,而是分析型数据库(OLAP)选择列式存储的原因。
行式存储
行式存储按行组织数据,每行数据连续存储:
行式存储的读取
行式存储特点
优点:
- 写入效率高(一行数据一次写入)
- 点查效率高(一次 I/O 读取整行)
- 适合 OLTP 场景
缺点:
- 读取部分列时,读取大量无用数据
- 列压缩效率低(不同类型数据混在一起)
列式存储
列式存储按列组织数据,每列数据连续存储:
列式存储的读取
列式存储的写入
压缩效率对比
列式存储的相邻数据是同类型数据,压缩效率远高于行式存储:
行式存储压缩
列式存储压缩
常见列式压缩算法
Parquet 与 ORC
Parquet
Parquet 是 Apache Parquet 项目的列式存储格式,被 Hive、Spark、Flink 等广泛使用。
ORC
ORC (Optimized Row Columnar) 是 Hive 的列式存储格式,优化了 Hive 的查询性能。
选型建议
混合存储
现代数据库往往采用混合策略:
ClickHouse 的 MergeTree
ClickHouse 使用 MergeTree 引擎,融合行列存储:
- 主键排序:按主键排序存储,支持点查
- 分区:按日期分区,便于删除和扫描
- 稀疏索引:每 8192 行一个索引,快速定位
数据加载策略
核心结论:OLTP 选行式,OLAP 选列式。理解数据的访问模式,是做出正确选择的前提。