一、基础概念
传统数据库是行式存储:一行数据完整连续存放; 列式存储(Columnar Storage):把表中同一列的所有值连续集中存储,按列拆分独立文件/存储块。
假设有表:学生(学号,姓名,年龄)
行存存储结构(一行打包)
(001,张三,18)、(002,李四,19)、(003,王五,18) 磁盘连续存整行。
列存存储结构(按列分开存)
列1【学号】:001,002,003 列2【姓名】:张三,李四,王五 列3【年龄】:18,19,18 每一列单独一段存储。
二、核心优势
-
查询IO大幅减少(分析场景最大优势) 报表、统计SQL只需要少数几列,不用读取整行无用字段,只加载需要的列,磁盘读取量极低。 例:统计所有学生平均年龄,行存要读全部三列;列存只读取年龄一列。
-
压缩效率极高 同一列数据类型相同、取值重复度高(性别、地区、年份),通用压缩算法(RLE、字典编码、LZ4)压缩率远高于行存,节省存储空间。
-
聚合计算性能强 求和、计数、分组、过滤等OLAP分析运算,基于单列连续数据批量计算,CPU缓存命中率高,批量运算更快。
三、明显缺点(不适合联机事务OLTP)
- 单行插入、更新、删除性能差 新增一行需要分别修改每一列的存储文件,多次IO;行存只需追加一条记录。
- 少量字段查询、频繁修改场景劣势 适合大批量批量导入数据,不适合高频单条增删改。
- 整行读取场景低效 若查询需要表中绝大多数列,列存需要读取多个独立列文件,IO开销反而超过行存。
四、适用场景 vs 不适用场景
适用(OLAP联机分析处理)
- 数据仓库、大数据报表、多维分析
- 日志分析、用户行为统计、BI可视化
- 海量历史数据批量统计、分组聚合查询
不适用(OLTP联机事务处理)
- 电商订单、用户账户、交易系统(高频增删改、单条查询)
五、主流列式数据库产品
- 专用列存数据仓库:Vertica、Redshift、Greenplum、ClickHouse
- Hadoop大数据:Hive、Impala(底层支持列存格式Parquet、ORC)
- 混合存储:TiDB、Snowflake(同时支持行存+列存,HTAP混合负载)
六、行存、列存核心对比
| 维度 | 行式存储(MySQL/Oracle) | 列式存储(ClickHouse/Redshift) |
|---|---|---|
| 存储方式 | 按行连续存储 | 按列分开存储 |
| 查询特点 | 少量行、多字段、事务查询快 | 少数列、海量数据统计查询快 |
| 压缩效果 | 一般 | 极高,同列数据高度压缩 |
| 写入更新 | 单条增删改高效 | 批量写入友好,单行修改极慢 |
| 业务场景 | OLTP交易系统 | OLAP数据仓库、大数据分析 |
七、总结
列式存储数据库将数据表按列独立存储,同一列数据连续存放;优势是统计分析查询IO少、压缩率高、聚合运算速度快;缺点是单行增删改性能差;主要用于数据仓库、大数据OLAP分析场景,代表产品有ClickHouse、Vertica、Greenplum。
注意:本文归作者所有,未经作者允许,不得转载