上一篇
按行存储和按列存储
- 行业动态
- 2025-05-17
- 3
行存储按记录连续存放,擅事务处理;列存储按字段存放,压缩
按行存储与按列存储的核心区别
存储结构对比
特性 | 按行存储 | 按列存储 |
---|---|---|
数据排列方式 | 同一行的数据连续存储(如 [ID, Name, Age] ) | 同一列的数据连续存储(如所有 Name 列数据集中存放) |
物理存储单元 | 以行为单位(一行数据占用一段连续空间) | 以列为单位(一列数据占用一段连续空间) |
典型示例 | 传统关系型数据库(如 MySQL、PostgreSQL) | 分析型数据库(如 HBase、Parquet 文件格式) |
优缺点分析
按行存储
- 优点:
- 写入效率高(适合频繁插入/更新操作)
- 适合事务型场景(OLTP,如电商订单系统)
- 单条记录查询速度快
- 缺点:
- 读取大量列时性能差(需扫描整行)
- 压缩率低(同一行各列数据类型差异大)
按列存储
- 优点:
- 读取单列或少量列时性能极高(适合聚合查询)
- 数据压缩率高(同一列数据类型一致,支持字典编码、Run-Length Encoding 等)
- 适合分析型场景(OLAP,如数据仓库)
- 缺点:
- 写入效率低(需分别写入多列)
- 单条记录更新成本高(需修改多列存储块)
适用场景
场景 | 推荐存储方式 | 原因 |
---|---|---|
高频交易订单系统 | 按行存储 | 需要快速写入单条记录,且查询常基于主键(如订单 ID) |
大数据分析(BI) | 按列存储 | 需要高效执行聚合查询(如 SUM 、AVG ),且数据批量加载后较少更新 |
日志存储系统 | 混合存储(如 LSM-Tree) | 写入密集但需保留时间范围查询能力 |
相关问题与解答
问题 1:为什么列存储更适合数据压缩?
解答:
列存储将同一列的数据连续存放,同一列的数据类型一致(如整数、字符串),可针对列特性应用高效压缩算法。
- 重复值压缩:对数值列使用
Run-Length Encoding
(如连续多个相同值只需记录一次)。 - 字典编码:对字符串列建立全局字典(如
{"Apple": 1, "Banana": 2}
),存储时用字典编号代替原始值。
而行存储因同一行包含多种数据类型,压缩效果受限。
问题 2:按行存储和按列存储如何影响 SQL 查询性能?
解答:
- 按行存储:适合单条记录查询(如
SELECT FROM table WHERE id = 1
),可直接定位行地址读取。 - 按列存储:适合聚合查询(如
SELECT COUNT(), AVG(age) FROM table
),仅需读取涉及的列,且压缩数据可加速扫描。
例外:复杂多表关联查询中,行存储因局部性更好可能更优;而列存储需多次扫描不同