15445-06-StorageModelCompression

发布于 作者: Ethan

Mindmap

mindmap

一、数据库工作负载

OLTP:在线事务处理

OLTP 工作负载的特点是快速、短时运行的操作、重复性操作,以及每次仅对单个实体进行简单查询。
OLTP 工作负载通常写入操作多于读取操作,并且每次仅读取或更新少量数据。

例子: 亚马逊商店。用户可以将商品加入购物车并进行购买,但这些操作只影响他们的账户。


OLAP:在线分析处理

OLAP 工作负载的特点是长时间运行、复杂的查询(通常涉及计算聚合)以及对数据库大范围数据的读取。
在 OLAP 工作负载中,数据库系统通常分析并从 OLTP 侧收集的现有数据中推导出新的数据。

例子: 个性化的亚马逊购物广告,网站分析用户购物车和购买行为的数据,为不同用户选择不同广告。


HTAP:混合事务与分析处理

HTAP 是一种新型的工作负载,其中 OLTP 和 OLAP 工作负载共存于同一数据库实例中。

工作负载重点:

  • OLTP: 简单查询,写入密集型
  • OLAP: 复杂查询,读取密集型
  • HTAP: 两者结合

二、存储模型

数据库系统中,元组(tuple)在页面中的存储方式不同。

N-元存储模型(NSM,Row Store)

在 n-元存储模型中,DBMS 将单个元组的所有属性连续地存储在同一页面中。
这种方式非常适合 OLTP 工作负载。

优点:

  • 快速插入、更新和删除
  • 适用于读取完整元组的查询
  • 可支持索引导向的物理聚簇

缺点:

  • 扫描表的大部分或属性子集效率低
  • 内存局部性差
  • 难以应用压缩

分解存储模型(DSM,Column Store)

在 DSM 中,DBMS 将每个属性(列)分别连续存储在数据块中。
适合 OLAP 工作负载。

优点:

  • 查询时只读取所需列,减少 I/O
  • 更好的缓存局部性和查询性能
  • 更高的数据压缩率

缺点:

  • 点查询、插入、更新和删除较慢(需要拆分和拼接元组)

重建元组的两种方式:

  1. 固定长度偏移量(常用)
  2. 嵌入式元组 ID(存储开销较大)

PAX(Partition Attributes Across)

混合型存储模型,DBMS 在页面内部垂直划分属性。
结合行存储的空间局部性与列存储的高效扫描。

结构:

  • 行被水平划分为行组
  • 每个行组内部按列划分属性
  • 全局头部包含行组目录,每个行组有自己的元数据

三、数据库压缩

压缩常用于基于磁盘的 DBMS,以缓解磁盘 I/O 瓶颈。
在只读分析型系统中尤为常见。压缩能减少 I/O 但增加 CPU 计算开销。

对于内存数据库,需要在速度与压缩比之间平衡。

压缩方案应具备的特性:

  • 固定长度值(除非为独立存储的可变长度数据)
  • 支持延迟解压缩(Late Materialization)
  • 必须是无损压缩

压缩粒度(Compression Granularity)

  • 块级别: 压缩同一表的一组元组
  • 元组级别: 压缩整个元组(仅 NSM)
  • 属性级别: 压缩单个属性值
  • 列级别: 压缩多个元组的同一属性(仅 DSM)

四、简单压缩(Naive Compression)

使用通用压缩算法(如 Deflate、LZO、LZ4、Snappy、Zstd 等)。
通常以牺牲压缩率换取更高的压缩/解压速度。

缺点:

  • 需要频繁解压缩,影响性能
  • 压缩范围有限(例如 MySQL 将表拆分为小块)
  • 无法利用数据语义和查询结构,不能实现延迟解压缩

五、列式压缩(Columnar Compression)

列式压缩方案允许 DBMS 在不解压为原始形式的情况下读取数据。

运行长度编码(RLE)

压缩相同值的连续段,存储三元组:

  • 属性值
  • 起始偏移
  • 运行长度

RLE 效果取决于数据特性及列排序。


位打包编码(Bit-Packing)

当值小于最大声明大小时,用更少位存储。

补丁编码(Patching / Mostly Encoding)

为超出最大值的项使用特殊标记,并维护查找表。


位图编码(Bitmap Encoding)

为每个唯一值存储一个位图,位图中的位置对应表中元组是否包含该值。
适用于低基数属性(低唯一值数量)。

当基数过高时,位图会变大,可采用稀疏结构(如 Roaring Bitmaps)。


增量编码(Delta Encoding)

记录相邻值之间的差异,可结合 RLE 进一步压缩。


字典压缩(Dictionary Compression)

最常见的数据库压缩方案。
DBMS 使用较短的代码替换常见值,并维护映射表(字典)。

要求:

  • 快速编码与解码
  • 必须保持顺序(用于范围查询)

保持顺序的编码允许直接在压缩数据上执行操作,提高查询性能(如字符串匹配)。


Notes

smc1 smc2