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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

概述

数据压缩是一个把输入数据集按照一定的算法变换成更小的数据集的过程,解压是压缩的逆过程。如果算法对数据本身的语义了解得越多,则越可能利用语义信息进行针对性的处理,获得更好的压缩效果。数据库系统中用得比较多的压缩算法可以分为两大类:基于块的压缩、基于值的压缩。前者更为常见一些,在 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 。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL DataWorks 关系型数据库
DataWorks操作报错合集之如何处理数据同步时(mysql->hive)报:Render instance failed
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
19天前
|
canal 消息中间件 关系型数据库
Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
【9月更文挑战第1天】Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
114 4
|
27天前
|
关系型数据库 MySQL 数据库
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
|
3天前
|
存储 关系型数据库 MySQL
技术解析:MySQL中取最新一条重复数据的方法
以上提供的两种方法都可以有效地从MySQL数据库中提取每个类别最新的重复数据。选择哪种方法取决于具体的使用场景和MySQL版本。子查询加分组的方法兼容性更好,适用于所有版本的MySQL;而窗口函数方法代码更简洁,执行效率可能更高,但需要MySQL 8.0及以上版本。在实际应用中,应根据数据量大小、查询性能需求以及MySQL版本等因素综合考虑,选择最合适的实现方案。
17 6
|
3天前
|
关系型数据库 MySQL 数据处理
针对MySQL亿级数据的高效插入策略与性能优化技巧
在处理MySQL亿级数据的高效插入和性能优化时,以上提到的策略和技巧可以显著提升数据处理速度,减少系统负担,并保持数据的稳定性和一致性。正确实施这些策略需要深入理解MySQL的工作原理和业务需求,以便做出最适合的配置调整。
20 6
|
5天前
|
存储 关系型数据库 MySQL
分析MySQL主从复制中AUTO_INCREMENT值不一致的问题
通过对 `AUTO_INCREMENT`不一致问题的深入分析和合理应对措施的实施,可以有效地维护MySQL主从复制环境中数据的一致性和完整性,确保数据库系统的稳定性和可靠性。
23 6
|
21天前
|
SQL 存储 缓存
MySQL是如何保证数据不丢失的?
文章详细阐述了InnoDB存储引擎中Buffer Pool与DML操作的关系。在执行插入、更新或删除操作时,InnoDB为了减少磁盘I/O,会在Buffer Pool中缓存数据页进行操作,随后将更新后的“脏页”刷新至磁盘。为防止服务宕机导致数据丢失,InnoDB采用了日志先行(WAL)机制,通过将DML操作记录为Redo Log并异步刷新到磁盘,结合双写机制和合理的日志刷新策略,确保数据的持久性和一致性。尽管如此,仍需合理配置参数以平衡性能与数据安全性。
MySQL是如何保证数据不丢失的?
|
5天前
|
存储 关系型数据库 MySQL
分析MySQL主从复制中AUTO_INCREMENT值不一致的问题
通过对 `AUTO_INCREMENT`不一致问题的深入分析和合理应对措施的实施,可以有效地维护MySQL主从复制环境中数据的一致性和完整性,确保数据库系统的稳定性和可靠性。
18 1
|
24天前
|
存储 JSON 关系型数据库
MySQL与JSON的邂逅:开启大数据分析新纪元
MySQL与JSON的邂逅:开启大数据分析新纪元
|
30天前
|
缓存 关系型数据库 MySQL
在Linux中,如何优化MySQL性能,包括索引优化和查询分析?
在Linux中,如何优化MySQL性能,包括索引优化和查询分析?

热门文章

最新文章