当前位置:首页 > 行业动态 > 正文

按行存储和按列存储

行存储按记录连续存放,擅事务处理;列存储按字段存放,压缩

按行存储与按列存储的核心区别

存储结构对比

特性 按行存储 按列存储
数据排列方式 同一行的数据连续存储(如 [ID, Name, Age] 同一列的数据连续存储(如所有 Name 列数据集中存放)
物理存储单元 以行为单位(一行数据占用一段连续空间) 以列为单位(一列数据占用一段连续空间)
典型示例 传统关系型数据库(如 MySQL、PostgreSQL) 分析型数据库(如 HBase、Parquet 文件格式)

优缺点分析

按行存储

  • 优点
    • 写入效率高(适合频繁插入/更新操作)
    • 适合事务型场景(OLTP,如电商订单系统)
    • 单条记录查询速度快
  • 缺点
    • 读取大量列时性能差(需扫描整行)
    • 压缩率低(同一行各列数据类型差异大)

按列存储

  • 优点
    • 读取单列或少量列时性能极高(适合聚合查询)
    • 数据压缩率高(同一列数据类型一致,支持字典编码、Run-Length Encoding 等)
    • 适合分析型场景(OLAP,如数据仓库)
  • 缺点
    • 写入效率低(需分别写入多列)
    • 单条记录更新成本高(需修改多列存储块)

适用场景

场景 推荐存储方式 原因
高频交易订单系统 按行存储 需要快速写入单条记录,且查询常基于主键(如订单 ID)
大数据分析(BI) 按列存储 需要高效执行聚合查询(如 SUMAVG),且数据批量加载后较少更新
日志存储系统 混合存储(如 LSM-Tree) 写入密集但需保留时间范围查询能力

相关问题与解答

问题 1:为什么列存储更适合数据压缩?

解答
列存储将同一列的数据连续存放,同一列的数据类型一致(如整数、字符串),可针对列特性应用高效压缩算法。

  • 重复值压缩:对数值列使用 Run-Length Encoding(如连续多个相同值只需记录一次)。
  • 字典编码:对字符串列建立全局字典(如 {"Apple": 1, "Banana": 2}),存储时用字典编号代替原始值。
    而行存储因同一行包含多种数据类型,压缩效果受限。

问题 2:按行存储和按列存储如何影响 SQL 查询性能?

解答

  • 按行存储:适合单条记录查询(如 SELECT FROM table WHERE id = 1),可直接定位行地址读取。
  • 按列存储:适合聚合查询(如 SELECT COUNT(), AVG(age) FROM table),仅需读取涉及的列,且压缩数据可加速扫描。
    例外:复杂多表关联查询中,行存储因局部性更好可能更优;而列存储需多次扫描不同
0