首页/数据/NoSQL 速查/行存与列存的选择依据
选型与架构50 条

行存与列存的选择依据

行存按整行连续存储,点查与整行读取高效;列存按列组织,扫描少量列的大范围统计时 IO 更省且压缩率高,代价是逐行更新与点查不擅长。

NoSQL 速查数据更新于 2026-10-13

行存与列存怎么选

行存按整行连续存储,点查与整行读取高效;列存按列组织,扫描少量列做大范围统计时 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 * 返回宽行会把列存优势抵消掉,查询应显式选择需要的列。
选型前用真实数据量做一次对照压测:同一份数据分别在行存与列存上跑典型查询,用实测耗时与磁盘占用做决定,比按经验推断可靠。

易错点

  • 把高频更新的状态表放列存会持续产生 part 重写,收益为负
  • 列存上做 SELECT * 返回宽行会把列存优势抵消掉,查询应显式选列
  • 只按存储成本选列存,忽略点查延迟不满足业务要求
  • 两类存储之间的同步链路没有监控,分析侧数据延迟无人察觉

数据来源与参考

  • ClickHouse Docs: MergeTree
  • ClickHouse Docs: Overview
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌