MySQL · 实现分析 · HybridDB for MySQL 数据压缩

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 概述数据压缩是一个把输入数据集按照一定的算法变换成更小的数据集的过程,解压是压缩的逆过程。如果算法对数据本身的语义了解得越多,则越可能利用语义信息进行针对性的处理,获得更好的压缩效果。数据库系统中用得比较多的压缩算法可以分为两大类:基于块的压缩、基于值的压缩。前者更为常见一些,在 OLTP 以及 OLAP 系统中都会用到,例如 InnoDB、TokuDB、HybridDB 中的块压缩;后者更多

概述

数据压缩是一个把输入数据集按照一定的算法变换成更小的数据集的过程,解压是压缩的逆过程。如果算法对数据本身的语义了解得越多,则越可能利用语义信息进行针对性的处理,获得更好的压缩效果。数据库系统中用得比较多的压缩算法可以分为两大类:基于块的压缩、基于值的压缩。前者更为常见一些,在 OLTP 以及 OLAP 系统中都会用到,例如 InnoDB、TokuDB、HybridDB 中的块压缩;后者更多的用在 OLAP 的列存引擎内,例如 HybridDB for MySQL 中的列压缩。为了区别它们,这里把块压缩简称为压缩(Compression)、而把基于值的压缩称为编码(Encoding)。此外,在存储系统中比较常见的重复数据删除功能也可以被视为一种特殊形式的压缩。不过它不属于本文要考虑的范围。

通常来说,列存格式对压缩要更友好。大概而言,行存的数据压缩率一般为3:1(采用通用压缩算法);列存的数据压缩率为10:1(采用编码以及通用的压缩算法)。

无论是哪种形式的压缩,衡量算法本身是否适用的指标主要有:
1. 压缩率,也就是压缩前后数据大小的比率。
2. 吞吐量,也就是压缩和解压的速度。典型单位为 GB/s。
3. 资源消耗,压缩解压一般是计算密集型的算法,因此主要考虑的是 CPU 消耗。

压缩

压缩算法可以说是无处不在。常见的例子如各种文件压缩工具背后的压缩算法,包括 zip、rar 等等;各种图片格式对应的压缩算法,包括 png、jpeg 等等。数据库系统中用的都是无损压缩,图片压缩则可以采用有损压缩。很多算法都属于 lz 系列,例如:lz、lzo、quicklz 等等。多年以前 Google 推出的 Snappy ,虽然压缩率不是特别出众,但是吞吐量比较大、资源消耗比较小,因此获得了广泛的应用。最近几年 Facebook 推出的 zstd 算法具有类似的特征,也获得了很多应用。zstd 的主页上有一些测试的数据,可以作为参考:

pic

编码

编码则是利用数据的语义信息进行更加有针对性的压缩。当然,很多算法也在通用的压缩算法中被采用了。常见的编码算法有:行程编码(Run Length Encoding)、字典编码(Dictionary)、差值编码(Delta)、变长整数编码(Varint)、位变换(Bit Shuffle)、前缀编码(Prefix)、异或(XOR)等等。甚至可以说有多少种数据的规律就可以发明出多少种编码算法。例如:InfoBright 就可以对一系列的数字除以最大公约数,获得更小的数字,从而达到数据压缩的目的。

产品

下面让我们来看一看典型的几个 OLAP 产品对压缩算法的支持。

Apache Kudu

Apache Kudu 是一个比较有意思的项目,它支持多副本、列存,试图解决实时分析的需求。下图是它支持的编码/压缩方法:

pic

相对其他系统而言,Kudu 编码中比较特殊的一种是 BitShuffle 编码。假设输入的是类型 T 的一个数组,该编码的算法是:先保存每个值的 MSB 位(最高位),然后下一个 bit 位,一直到最后的 LSB(最低位);然后对数据进行 LZ4 压缩。该编码适合与重复值较多的列或者列值变化不大的情况。除了上述的编码之外,Kudu 也支持通用压缩算法,例如:lz4、snappy、zlib。默认情况下,列是不压缩的。而且 Bitshuffle 编码后的列总是自动采用 lz4 压缩。

Amazon RedShift

Amazon RedShift 支持的编码/压缩算法如下:

pic

从图中可以看出,RedShift 支持 Delta、字典、RLE、Mostly、Text255 等编码。比较特别的是 Text255 和 text32k,它们适合与单词重复出现的 VARCHAR 列。实际上,它就是对每个 1MB 块中的单词创建了一个字典。字典容纳 245 个唯一的单词,数据实际存储的时候用一个字节的索引代替对应的单词。

Pivotal GPDB

Pivotal GPDB 的 Append Only Table 也支持压缩算法 。

pic

相对而言,GPDB 支持的编码和压缩种类要稍少一些。但是它允许设置算法的压缩级别以及块的大小。

总结

不同的通用压缩算法在压缩率和速度以及资源消耗之间做了不同程度的权衡,有些算法(例如 zlib)还提供了一些压缩级别的参数可供调整。针对不同的数据集合,压缩率也存在较大的区别。例如:在采用某个特定数据集的测试中,snappy 的压缩率接近 3,而 zlib 和 zstd 的压缩率大约为 4。编码算法的压缩率对数据集的类型和取值更为敏感,例如 delta 算法对整数类型,并且相邻数据之间差别较小的情况下(例如自增列),压缩比就很好。对于浮点数而言,提高要缩率更为困难,Facebook 等曾经做过一些针对性的优化。

如果想要了解数据压缩的基本背景,请参考:Data compression tutorial 。如果想要获得对列存系统的更多知识(包括列存对数据压缩的优化),则建议移步:Column store tutorial 。

参考资料

1.Snappy
2.Zstd
3.Apache Kudu
4.Amazon RedShift
5.GreenPlum Database
6.Gorilla
7.Data compression tutorial
8.Column store tutorial

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
负载均衡 Linux 数据库
阿里云轻量应用服务器套餐收费标准参考(组合套餐、负载均衡套餐等)
阿里云轻量应用服务器有多种套餐,在购买轻量应用服务器、轻量应用负载均衡、轻量容器服务和轻量数据库服务时,我们可以根据业务需求选择合适的套餐。本文为大家介绍阿里云轻量应用服务器套餐和镜像最新价格表以及相关收费说明。
1063 0
阿里云轻量应用服务器套餐收费标准参考(组合套餐、负载均衡套餐等)
|
消息中间件 Linux 数据处理
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(二)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
489 1
|
消息中间件 存储 NoSQL
redis协议与异步方式学习笔记
redis协议与异步方式学习笔记
254 0
|
网络协议 Linux 数据安全/隐私保护
|
网络协议 Linux
linux系统重要文件目录
本文介绍了Linux系统中的重要目录及其历史背景,包括根目录、/usr、/etc、/var/log和/proc等目录的结构和功能。其中,/etc目录下包含了许多关键配置文件,如网卡配置、DNS解析、主机名设置等。文章还详细解释了各目录和文件的作用,帮助读者更好地理解和管理Linux系统。
368 2
|
JavaScript 算法 前端开发
为什么虚拟 dom 会提高性能?
【10月更文挑战第1天】
|
消息中间件 传感器 Cloud Native
事件驱动作为分布式异步服务架构
【6月更文挑战第25天】本文介绍事件驱动架构(EDA)是异步分布式设计的关键模式,适用于高扩展性需求。EDA提升服务韧性,支持CQRS、数据通知、开放式接口和事件流处理。然而,其脆弱性包括组件控制、数据交换、逻辑关系复杂性、潜在死循环和高并发挑战。EDA在云原生环境,如Serverless,中尤其适用。
630 2
事件驱动作为分布式异步服务架构
|
运维 监控 安全
构建高效运维体系的策略与实践
【10月更文挑战第7天】 本文旨在探讨如何构建高效的运维体系。从明确定义目标、优化流程、引入自动化工具、建立监控机制到提升团队能力,我们将全面解析高效运维体系的构建步骤和关键要素。通过具体策略和成功案例的分享,帮助运维团队提升工作效率、减少故障发生,并持续改进运维质量。
457 0
|
机器学习/深度学习 数据挖掘 vr&ar
时间序列预测利器:Sklearn中的ARIMA与状态空间模型
【7月更文第24天】时间序列预测是数据分析和机器学习领域的一个重要分支,它致力于从历史数据中挖掘规律,预测未来的发展趋势。在Python的Scikit-learn库中,虽然直接提供的时间序列预测模型不如专门的时间序列分析库如Statsmodels或Prophet那样丰富,但Scikit-learn的强大之处在于其模型的灵活性和集成能力,尤其是状态空间模型的实现,为自定义复杂时间序列模型提供了坚实的基础。本文将介绍如何使用Scikit-learn进行时间序列预测,重点聚焦在ARIMA模型(通过Statsmodels间接实现)和状态空间模型的使用上,并通过代码示例深入解析。
1551 0
|
弹性计算 Shell 数据安全/隐私保护
ECS云服务器新手上路
本实验会自动创建一台ECS实例。首先,远程登陆ECS实例,并部署应用。然后,登陆管理控制台,并对这台ECS实例进行管理操作。

相关产品

  • 云数据库 RDS MySQL 版