根本区别在于数据在磁盘上的物理组织方式:行存储以“行”为单位连续存放整条记录,列存储以“列”为单位连续存放同类型字段值;前者适用于OLTP,后者适用于OLAP;列存压缩率高、分析性能优,行存事务处理快、单行操作高效。

根本区别在于数据在磁盘上的物理组织方式:行存储以“行”为单位连续存放整条记录,列存储以“列”为单位连续存放同类型字段值。
数据排列方向不同
行存储是横向组织——每条记录的所有字段(如 user_id、name、age、city)挨着存,读一行就加载全部字段。列存储是纵向组织——所有 user_id 存一起,所有 name 存一起,所有 age 存一起,彼此物理隔离。
- 行存示例物理顺序:(1, 张三, 25, 北京), (2, 李四, 30, 上海)
- 列存示例物理顺序:user_id:[1,2] → name:["张三","李四"] → age:[25,30] → city:["北京","上海"]
适用场景天然分化
行存储面向事务处理(OLTP),强调快速定位和修改单条完整记录;列存储面向分析处理(OLAP),强调高效扫描、聚合少数几列。
Metafox 是一个企业内容管理系统,使用一个特别的模板系统,你可通过一些特定的设计和代码来轻松创建 Web 网站,内容存储在 SQL 关系数据库,通过 Web 进行管理,简单、快速而且高效。 Metafox 0.9.1 发布,该版本改用一种更棒的 URL 风格,实现了 RSS 源(可包含远端网站内容到 Metafox 段中),重定向老的访问密钥到新的密钥,增加 RotateAntispam 技
- 查某用户全部信息(SELECT * FROM users WHERE id = 100)→ 行存一次定位即得,列存要跨多个列块拼装
- 算全表平均年龄(SELECT AVG(age) FROM users)→ 列存只读 age 列,I/O 少、压缩好;行存需扫每行再提取 age,带入大量无关字段
写入与压缩机制差异明显
行存写入是一次性落盘整行,适合高频小批量插入;列存写入需拆解为 N 次独立列写,单行更新开销大。列内数据同质,利于字典编码、RLE 等压缩,压缩率常达 5–10 倍;行内混杂类型,压缩收益有限。
- 新增一条订单记录:行存 → 1 次写入;列存 → 分别写 order_id、amount、time 等 N 列
- status 列含大量 "success":列存可用字典表压缩为单个整数;行存因前后夹着金额、时间等异构字段,难压缩
索引与执行优化逻辑不同
列存天然支持位图索引、谓词下推、向量化执行——因为每列自成数据流,过滤和计算可并行推进;行存依赖 B+ 树等结构索引整行,优化重心在连接路径和事务一致性保障。
- WHERE status = 'error' AND amount > 1000:列存可先用位图快速筛出 error 行号,再按号取对应 amount 值;行存通常走联合索引或全表扫描
- COUNT(*) + SUM(amount):列存两个操作可流水线执行;行存往往需两遍扫描或额外物化中间结果









