1. 行式存储与列式存储的本质差异
在数据库存储引擎领域,行式存储(Row-based Storage)和列式存储(Column-based Storage)是两种截然不同的数据组织方式。它们的核心区别不在于技术实现细节,而在于对数据访问模式的底层假设。
行式存储将每条记录的所有字段连续存放在一起,就像把一个人的完整档案装进一个文件袋。当查询需要获取某个人的全部信息时,这种存储方式表现出色。典型的MySQL的InnoDB引擎就是这种存储方式的代表,它的数据页中连续存储着完整的记录,包括所有字段值。
而列式存储则像把所有人的姓名、年龄、地址等信息分别整理成独立的清单。当需要统计全公司员工的平均年龄时,列式存储只需读取"年龄"这一列的数据,完全不需要触碰其他无关字段。这种特性使列式存储在分析型场景中大放异彩,ClickHouse、Vertica等OLAP数据库就是基于这种存储模型。
关键洞察:选择行式还是列式,本质上是在优化不同方向的I/O效率。行式优化的是"获取单条记录全部字段"的场景,列式优化的是"获取大量记录的少数字段"的场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 存储结构的物理实现对比
2.1 行式存储的物理布局
在行式存储中,一个典型的物理存储单元(如4KB的数据页)会包含:
- 页头元数据(校验和、LSN等)
- 行指针数组(记录每条记录在页内的偏移量)
- 连续存储的记录数据
- 可能的空闲空间
以员工表为例,一个数据页可能存储着几十条完整的员工记录,每条记录包含员工ID、姓名、部门、薪资等所有字段。这种布局使得根据主键查找某位员工的全部信息非常高效,通常只需一次磁盘读取就能获取所有相关数据。
2.2 列式存储的物理布局
列式存储则采用完全不同的组织方式:
- 每列数据独立存储为物理文件
- 同一列的值通常连续存储
- 采用高效的编码和压缩方案
- 维护元数据记录各列的统计信息
在Parquet文件格式中,我们能看到典型的列存结构:
code复制├── 员工ID.column
├── 姓名.column
├── 部门.column
└── 薪资.column
每个column文件内部又分为多个数据块,采用RLE、字典编码等技术压缩存储。当查询只需要部门分布统计时,系统只需读取"部门.column"文件,完全忽略其他列数据。
