上一篇
按行存储与按列存储过程
- 行业动态
- 2025-05-17
- 2
按行存储逐行顺序存放数据,便于行遍历;按列存储以列为单位组织数据,同列连续存储,压缩高效,适合
按行存储过程
数据组织
数据以行为单位连续存储,同一行的所有列值在物理上相邻,用户表的一行数据包含ID
、姓名
、年龄
等字段,这些字段的值按顺序存储在磁盘或内存中。写入流程
- 插入一条记录时,将所有列的值按顺序写入一个连续的存储块。
- 示例:插入
(1, "张三", 25)
,存储结构为1 | 张三 | 25
(表示分隔符)。
读取流程
- 读取单行数据时,直接定位到该行的起始位置,顺序读取所有列的值。
- 示例:查询
ID=1
的用户信息,直接读取1 | 张三 | 25
并解析为完整行。
特点
- 优势:单行查询效率高,适合频繁的增删改操作(如OLTP系统)。
- 劣势:涉及多列的查询需要读取整行,浪费带宽和计算资源。
按列存储过程
数据组织
数据以列为单位连续存储,同一列的所有值在物理上相邻,用户表的ID
列、姓名
列、年龄
列分别独立存储。写入流程
- 插入一条记录时,将每个列的值分别追加到对应列的存储区域。
- 示例:插入
(1, "张三", 25)
,ID
列追加1
,姓名
列追加张三
,年龄
列追加25
。
读取流程
- 读取单列数据时,直接扫描该列的存储块。
- 示例:查询
年龄>20
的用户,只需读取年龄
列的所有值并过滤。 - 行重组:若需完整行数据,需从多列存储块中拼接(如读取
ID=1
的完整行,需从ID
、姓名
、年龄
列分别获取值)。
压缩优化
- 同一列的数据类型一致,适合高效压缩(如Run-Length Encoding、字典编码)。
- 示例:
年龄
列的数据[25, 25, 26, 25]
可压缩为25×3, 26×1
。
特点
- 优势:适合聚合查询(如SUM、AVG),减少IO开销(如只读需要的列)。
- 劣势:单行查询需跨列拼接,写入时可能产生额外开销(如数据对齐)。
核心差异对比表
特性 | 按行存储 | 按列存储 |
---|---|---|
存储结构 | 行连续存储 | 列连续存储 |
查询效率 | 单行查询快,多列查询慢 | 单列查询极快,多列查询需拼接 |
压缩效果 | 压缩率低(混合类型数据) | 压缩率高(单一类型数据) |
适用场景 | OLTP(事务处理) | OLAP(数据分析) |
写入性能 | 高(单次写入一行) | 低(需写入多列) |
更新成本 | 低(修改单行) | 高(可能涉及多列块) |
相关问题与解答
问题1:为什么列存储更适合数据分析?
解答:
列存储将同一列的数据连续存储,且支持高效压缩,在数据分析场景(如聚合、统计)中,查询通常只需访问少数列,列存储可减少IO开销,计算某列的平均值时,只需读取该列的数据,无需加载整行数据,压缩后的数据块更小,进一步提升读取速度。
问题2:行存储和列存储能否结合使用?
解答:
可以结合使用,某些数据库(如ClickHouse)采用列式存储,但对数据更新采用行级操作(如主键索引),另一种方式是混合存储,例如将热数据(高频更新)按行存储,冷数据(历史数据)按列存储,这种设计兼顾了事务处理和分析的需求