上一篇
按行存储跟按列存储
- 行业动态
- 2025-05-17
- 5
行存储按记录连续存放,适合事务处理;列 存储按字段存,压缩高效,适用于分析查询
按行存储与按列存储的核心区别
数据存储结构
特征 | 按行存储 | 按列存储 |
---|---|---|
数据单元 | 以整行数据为单位连续存储 | 以列为单位独立存储 |
示例 | [ID=1, Name=Alice, Age=30] | [ID列:1,2,3...][Name列:Alice,Bob...] |
物理布局 | 行内字段连续,行间可能分散 | 同一列数据物理相邻,不同列独立 |
读写性能对比
操作类型 | 按行存储 | 按列存储 |
---|---|---|
单条记录查询 | 高效(直接读取整行) | 低效(需拼接多列数据) |
列聚合查询 | 低效(需扫描全行) | 高效(仅读取相关列) |
写操作 | 高吞吐量(顺序写入整行) | 低吞吐量(需分别更新多列) |
压缩效率差异
压缩类型 | 按行存储 | 按列存储 |
---|---|---|
数据特征 | 同一行内字段相关性低 | 同一列内数据类型/值相似度高 |
压缩效果 | 压缩率低(混合类型数据) | 压缩率高(列内重复值优化) |
典型算法 | 通用压缩(如LZ77) | 列式专用压缩(如Run-Length Encoding) |
适用场景对比
场景需求 | 推荐存储方式 | 原因 |
---|---|---|
事务处理(OLTP) | 按行存储 | 频繁单条记录读写,ACID特性关键 |
分析查询(OLAP) | 按列存储 | 大规模聚合计算,读多写少场景 |
实时日志处理 | 按行存储(如Parquet混合模式) | 兼顾流式写入与灵活查询需求 |
相关问题与解答
Q1:为什么OLAP系统(如Hive)偏好列式存储?
A:OLAP场景需要频繁执行聚合、分组等操作,列式存储仅需读取相关列,减少IO消耗,例如统计年龄分布时,按列存储只需扫描Age
列,而按行存储需加载全部字段。
Q2:如何将行式存储转换为列式存储?
A:通过Shuffle/Reshuffle操作实现:
- 读取原始行式数据
- 按列拆分重组数据块
- 对每列独立编码压缩
- 生成列式存储文件(如Parquet格式)
补充说明
现代存储系统(如Apache ORC/Parquet)常采用混合存储策略:
- 基础单位为列块:每个Column Block包含多个列的垂直切片
- 嵌套行组:将多行打包为Row Group,平衡读写性能
- 动态优化:根据查询类型自动选择扫描粒度