1. 存储方式的本质差异
第一次接触数据库存储引擎时,我被行存和列存的概念困扰了很久。直到亲手用Python实现了一个简易版本,才真正理解它们的设计哲学。行存就像传统图书馆的书架——每本书(记录)按顺序摆放,想找《哈利波特》就按字母顺序走到H区;而列存则像把书拆成章节分别存放,所有书的第1章放在A架,第2章放在B架...
1.1 行式存储的物理布局
行存储(Row-based Storage)采用NSM(N-ary Storage Model)模型,在磁盘上连续存储整行数据。以员工表为例:
code复制| ID | Name | Dept | Salary | HireDate |
|----|-------|-------|--------|-----------|
| 1 | Alice | Sales | 5000 | 2020-01-15|
| 2 | Bob | IT | 6000 | 2019-05-20|
物理存储表现为二进制连续块:
code复制[1,Alice,Sales,5000,2020-01-15][2,Bob,IT,6000,2019-05-20]...
这种布局的优势在于:
- 单行读取效率高(一次I/O获取完整记录)
- 适合OLTP场景(如银行转账需要同时更新多个字段)
- 写入性能稳定(追加式写入)
我在电商系统开发中就深有体会:用户下单时需要同时插入订单表、订单明细表等多个关联表,行存储在这种高频短事务场景下表现优异。
1.2 列式存储的物理布局
列存储(Column-based Storage)采用DSM(Decomposition Storage Model)模型,每个列单独存储。同样的员工表会拆分为:
code复制ID列: [1,2,...]
Name列: [Alice,Bob,...]
Dept列: [Sales,IT,...]
...
这种设计带来三个显著特性:
- 同类型数据连续存储(所有工资数值紧邻排列)
- 可采用列专属压缩算法(如Delta编码/RLE)
- 支持向量化处理(SIMD指令并行计算)
在数据仓库项目中,我曾对比过查询性能:统计销售部门平均工资,列存比行存快8倍。因为只需读取Dept和Salary两列,且列存压
