行存与列存怎么选
行存按整行连续存储,点查与整行读取高效;列存按列组织,扫描少量列做大范围统计时 IO 更省、压缩率更高,代价是逐行更新与点查不擅长。判断依据主要是访问模式:按主键读写、事务、整行返回选行存;事实表聚合、宽表只取少列、大批量导入选列存。混合负载可以分层,交易与状态用行存,明细与指标用列存,中间用同步链路连接。
基本信息
| 行存适合 | 按主键读写、事务、宽表整行返回 |
|---|---|
| 列存适合 | 事实表聚合、只取少列、高压缩比与批量导入 |
| 更新代价 | 列存更新多为 part 重写,不适合高频单行改 |
| 典型组合 | 行存做交易,列存做分析,同步链路连接 |
典型使用场景
- 交易系统:订单、账户状态用行存保证低延迟点查
- 分析平台:明细与指标用列存提升聚合速度
- 宽表统计:只读少数几列的年度汇总用列存更省 IO
- 日志归档:压缩率优先的场景用列存
- 分层架构:两类存储通过 CDC 或导出任务连接
列存优势场景
列存优势场景
-- 只读少数几列聚合海量明细
SELECT region, count() AS orders, sum(amount) AS gmv
FROM fact_orders
WHERE dt BETWEEN '2024-01-01' AND '2024-06-30'
GROUP BY region;
-- 行存优势场景:按主键取整行
-- SELECT * FROM orders WHERE id = 1001;选择依据
| 维度 | 行存 | 列存 |
|---|---|---|
| 点查 | 优势明显 | 需要读取整列块 |
| 大范围扫描 | 会读多余列 | 只读所需列,IO 更省 |
| 更新 | 就地更新友好 | 多为合并式重写 |
| 压缩率 | 一般 | 同列类型一致,压缩率更高 |
| 典型场景 | 交易与状态 | 明细聚合与报表 |
混合负载可以分层:交易与状态用行存,明细与指标用列存,通过同步链路连接,两边的优化目标互不干扰。
把高频更新的状态表放进列存会持续产生 part 重写,收益为负。
列存上执行 SELECT * 返回宽行会把列存优势抵消掉,查询应显式选择需要的列。
选型前用真实数据量做一次对照压测:同一份数据分别在行存与列存上跑典型查询,用实测耗时与磁盘占用做决定,比按经验推断可靠。