输入“/”快速插入内容

数据库压缩

真实世界的数据特征
数据集往往具有 高度偏斜 的属性值分布。
例子: 布朗语料库的 Zipfian 分布。
数据集倾向于在同一元组的属性之间具有 高相关性
例子: Zip Code 与城市,订单日期与发货日期
观察
I/O 是传统上查询执行过程中的主要瓶颈。如果 DBMS 仍然需要读取数据,我们需要确保它能最大限度地从数据中提取有用的信息。
关键的权衡是速度压缩率
压缩数据可以减少 DRAM 的需求和处理量。
本节话题
背景介绍
Naïve 的页面压缩
Native 列式压缩
中间数据
数据库压缩的目的
减少数据库物理表示的大小,以增加每单位计算或 I/O 的访问和处理的数值数量。
目标1:必须产生 固定长度 的值。
目标2:必须是一个 无损 的方案。
目标3:理想情况下,在查询执行过程中尽可能地 推迟解压时间
有损压缩和无损压缩的对比
当DBMS使用压缩时,它总是无损的,因为人们不喜欢丢失数据。
任何种类的 有损压缩都必须在应用层面进行
在查询执行过程中,读取少于整个数据集的数据,有些类似压缩。
近似查询处理
如果我们想在我们的 DBMS 中添加压缩功能,我们必须问自己的第一个问题是,什么是我们想要压缩的东西?
这就决定了我们可以使用哪些压缩方案。
压缩颗粒度
选择 #1: 块级
压缩表的一个块(例如,数据库页面,RowGroup)。
选择 #2: 元组级
压缩整个元组的内容(仅限行存)。
选择 #3: 属性级
压缩一个元组中的单个属性值。
可以针对同一个元组的多个属性。
选择 #4: 列级
压缩一个或多个存储在多个元组中的属性的多个值(只限于列存)。
NAÏVE 压缩
使用一个 通用的算法 来压缩数据,压缩的范围只基于输入的数据。
LZO(1996),LZ4(2011),Snappy(2011),Brotli(2013),Oracle OZIP(2014),Zstd(2015)。
考虑因素
计算开销
压缩与解压的速度
举例:MYSQL INNODB 压缩