写点什么

解读 TaurusDB 字段压缩:减少存储成本,避免语句大量修改

  • 2025-01-17
    广东
  • 本文字数:4230 字

    阅读完需:约 14 分钟

解读TaurusDB字段压缩:减少存储成本,避免语句大量修改

摘要:TaurusDB 的字段压缩功能,不仅支持用户根据需求进行自选压缩算法等操作,实现细粒度的压缩策略调整,还能够自动识别并压缩符合条件的字段。

 

本文分享自华为云社区《【华为云MySQL技术专栏】TaurusDB新特性解读:字段压缩》,作者:GaussDB 数据库。


1. 技术背景

数据库压缩是一种数据管理技术,通过特定的压缩算法将数据库中的数据进行压缩,以减少存储空间占用,从而达到显著降低成本的效果。


社区 MySQL InnoDB 的压缩功能主要针对长期存储的冷数据,对于频繁访问的热数据,由于可能带来高达 50%的性能影响,因此在生产环境中应用较少。现有的压缩机制,如表压缩和页面压缩,难以在不影响业务正常运行的情况下,提供针对特定字段的自定义压缩方式的灵活性。


自社区 MySQL InnoDB 5.1 版本起,开始支持表压缩功能,使用方式为 CREATE TABLE ... ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8,这种方式要求数据必须压缩到固定大小,比如 1K、2K、4K 或 8K,且一旦指定,不可修改。


到了社区 MySQL InnoDB 5.7 版本,进一步支持页面压缩,使用方式为 CREATE TABLE ... COMPRESSION="zlib"。在 Checkpoint 刷页面时,对页面数据进行压缩,而读取到 Buffer Pool 时,则进行解压缩。压缩页会在 Buffer Pool 中,同时保留压缩和非压缩两个版本,占用 Buffer Pool 空间,这种压缩方式与块大小相关。例如,当文件系统块大小为 4KB 时,16KB 页面中数据被压缩到 9KB,它仍然会占用 3 个 4KB 文件系统块。


为满足客户追求更佳成本效益的需求,TaurusDB 研发并推出了字段级压缩特性,旨在提供更为精细的压缩控制,以实现更高效的存储优化。


2.特性价值

TaurusDB 推出细粒度的字段压缩功能,针对 VARCHAR 和 LOB 字段,提供了 ZLIB 和 ZSTD 两种压缩算法。在字段数据存储到 Page 时进行压缩,读取字段时进行解压缩,确保 Page 大小不变,REDO 数据中保存压缩后的数据。用户可以根据实际需求,综合考虑压缩比和压缩/解压操作的性能影响,选择合适的压缩算法和等级,对不频繁访问的大字段进行压缩。


同时,TaurusDB 字段压缩特性还提供了自动压缩的能力,对用户表中满足类型及长度阈值的列自动添加压缩属性,帮助用户更方便地使用此特性。


通过相关基准模型测试,开启字段压缩特性后,若业务不涉及压缩字段,则对性能无影响;若涉及压缩字段,则通常系统性能损失在 10%以内。而进行压缩前后的数据大小比值可达 1.8 及以上,这意味着以较小的性能损耗为代价,显著降低了存储成本,实现了经济效益与系统效率的平衡。


3.实现原理

TaurusDB 字段压缩特性,在存储层面上根据不同情况采用压缩或非压缩格式,实现了高效的数据压缩与解压缩。


在存储引擎层 Compact 行格式数据,如图 1 所示,对于 VARCHAR 等这种变长的数据类型,系统不仅需要存储该字段的实际数据,还需要额外存储该数据的长度信息(即占用的字节数)。


图 1  Compact 行格式数据


TaurusDB 实现的字段压缩特性,在各列数据中增添了代表压缩属性的内容。对于未使用字段压缩特性的列,其值保持原有格式;而对于已使用字段压缩特性的列,将上述所示的列数据值,改为如下所示两种格式。


第一种,字段压缩中的压缩格式,如图 2 所示:


图 2  字段压缩中的压缩格式


它包含 Compress Header(压缩头)、Uncompressed Data Len(未压缩前的字段长度)和 Compressed Data(压缩数据),作用如下:


Compress Header:保存是否已进行压缩、采用的压缩算法等元数据。

Uncompressed Data Len:保存数据在压缩前的原始长度,即占用的字节数。

Compressed Data:保存经过压缩处理后的实际数据内容。


第二种,字段压缩中的非压缩格式,如图 3 所示:


图 3  字段压缩中的非压缩格式


它包含 Compress Header(压缩头)和 Original Uncompressed Data(未压缩数据),其作用如下:


Compress Header:保存是否已进行压缩、采用的压缩算法等元数据。

Original Uncompressed Data:直接存储未压缩的数据,避免不必要的压缩处理。


在处理数据时,如果数据过短,即小于字段压缩阈值参数 rds_column_compression_threshold,或调用压缩接口后发现并未明显带来存储空间的节省时,系统将采用该格式。


对于包含压缩字段的写入流程:在调用 row_mysql_store_col_in_innobase_format 函数,将 SQL 引擎层数据转为存储引擎层数据时,若通过元信息判断字段存在压缩属性,则调用压缩接口,将压缩后的数据写入 Page 中,以不改变页面大小而减少页面数量的方式,减少占用的存储空间。


对于包含压缩字段的读取流程:在调用 row_sel_field_store_in_mysql_format_func 函数,将存储引擎层数据转为 SQL 引擎层数据时,若通过元信息判断字段存在压缩属性,则调用解压缩接口。


TaurusDB 压缩/解压缩实现的效果如图 4 所示,对于 SQL Engine 层而言,看到的内容均为未压缩的数据,而压缩/解压缩的动作实际发生在 Storage Engine 层,且只针对具有压缩属性的列单独进行压缩。

图 4  TaurusDB 压缩/解压缩示意

4 业务场景/流程

4.1 特性参数

为了使得 TaurusDB 字段压缩特性更方便地被用户所使用,已开放 5 个相关参数,在“实例管理”处点击“参数修改-参数”页面即可调整字段压缩参数,如图 5 所示。


图 5 调整字段压缩参数


各个参数的具体范围及含义见表 1 所示。


表 1  字段压缩参数说明

4.2 使用

  • 显式压缩 [rds_column_compression=1]

例如,显式地创建压缩字段(如图 5,设置默认压缩算法参数 rds_default_column_compression_algorithm=ZLIB),在 SQL 语句中对需要进行压缩的字段显式地标记出压缩属性 compressed,若不单独指定压缩算法,则按照 rds_default_column_compression_algorithm 参数指定的算法使用。


图 6  显式压缩参数设置


执行如下 SQL 语句:

create table t1(c1 varchar(100) compressed, c2 varchar(100) compressed=zlib, c3 varchar(100) compressed=zstd) default charset=latin1;
复制代码

对 t1 表中的三列显式添加压缩属性,并对 c3 列单独指定压缩算法为 ZSTD,查看显式压缩添加的压缩属性,如图 7 所示。


图 7  查看压缩属性


  • 自动压缩 [rds_column_compression=2]

例如,自动地创建压缩字段(如图 8,设置字段压缩阈值参数 rds_column_compression_threshold=100,设置默认压缩算法参数 rds_default_column_compression_algorithm=ZLIB),SQL 语句不需要改造,自动对符合条件的列添加压缩属性。


图 8  自动压缩参数设置


执行如下 SQL 语句:

create table t2(c1 varchar(99), c2 varchar(100)) default charset=latin1;
复制代码

系统将自动为 t2 表的 c2 列添加压缩属性,使用 rds_default_column_compression_algorithm 参数值作为默认压缩算法,查看自动压缩添加的压缩属性,如图 9 所示。


图 9  查看压缩属性


  • 关闭压缩 [rds_column_compression=0]

关闭特性后,无法再继续对列添加压缩属性,设置参数如图 10 所示。


图 10  关闭压缩参数设置


执行如下 SQL 语句:

create table t3(c1 varchar(100) compressed, c2 varchar(100) compressed=zlib, c3 varchar(100) compressed=zstd) default charset=latin1;
复制代码

即便已对列添加压缩属性,但实际不生效,关闭效果如图 11 所示。


图 11  查看关闭效果


  • 观察效果

通过展示表结构信息,如果发现其中包含/*!99990 800220201 COMPRESSED=xxxx */的注释内容,可认为该表中的某些字段已使用字段压缩特性,例如:

mysql> show create table t1\G*************************** 1. row ***************************Table: t1Create Table: CREATE TABLE `t1` (`c1` varchar(100) /*!99990 800220201 COMPRESSED=ZLIB */ DEFAULT NULL,`c2` varchar(100) /*!99990 800220201 COMPRESSED=ZLIB */ DEFAULT NULL,`c3` varchar(100) /*!99990 800220201 COMPRESSED=ZSTD */ DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin11 row in set (0.00 sec)
复制代码

利用系统视图 information_schema.columns 查询压缩字段,执行如下 SQL 语句,

select TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, EXTRA from information_schema.columns where extra like '%compressed%';
复制代码


查看当前所有的字段压缩列信息,结果如图 12 所示:


图 12  通过系统视图查询压缩字段


通过查询 status 信息,来确认字段压缩/解压缩接口的实际调用次数。例如,在将参数设置为 rds_column_compression_threshold=20 之后,对上述 t1 表进行插入数据以及查询数据操作,执行如下 SQL 语句,

show global status like '%column%compress%';
复制代码


观察压缩/解压缩接口调用情况,结果如图 13 所示:


图 13  查看压缩/解压缩接口调用情况


在表数据占用的存储空间较大时,可以通过查看监控界面信息来对比压缩前后存储占用大小,用于确认压缩效果。

 

5.总结

为了验证字段压缩的应用效果,通过构造两种场景来进行对比实验。

场景一如下所示。表中有 1 万行数据,每行数据是由 400 个 MD5 函数返回的 32 位字符串构成。

CREATE TABLE `random_data` (`id` int(11) NOT NULL AUTO_INCREMENT,`data` longtext,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
DELIMITER $$CREATE PROCEDURE `generate_random_data`()BEGINDECLARE i INT DEFAULT 1;DECLARE j INT DEFAULT 1;DECLARE str longtext;WHILE i <= 10000 DOSET j = 1;SET str = '';WHILE j <= 400 DOSET str = CONCAT(str, MD5(RAND()));SET j = j + 1;END WHILE;INSERT INTO `random_data` (`data`) VALUES (str);SET i = i + 1;END WHILE;END$$DELIMITER ;
复制代码

场景二如下所示,通过 sysbench 导入 64 张表,每张表包含 1000 万行数据,其中 c 和 pad 字段的数据类型被更改为 varchar。

CREATE TABLE `sbtest1` (`id` int NOT NULL AUTO_INCREMENT,`k` int NOT NULL DEFAULT '0',`c` varchar(120) COLLATE utf8mb4_0900_bin NOT NULL DEFAULT '',`pad` varchar(60) COLLATE utf8mb4_0900_bin NOT NULL DEFAULT '',PRIMARY KEY (`id`),KEY `k_1` (`k`)) ENGINE=InnoDB AUTO_INCREMENT=10000001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin
复制代码

通过将`rds_column_compression`参数分别设置为 0(表示不压缩)和 2(表示启用压缩),并在保持其他参数为默认值的情况下,我们在两种不同的场景进行了对比测试。结果显示,对于场景一,表压缩前后的存储大小比约为 1.8,而场景二的这一比值则约为 1.2,且压缩后的性能损耗最高在 10%左右。


这表明,TaurusDB 的字段压缩功能,不仅支持用户根据需求进行自选压缩算法等操作,实现细粒度的压缩策略调整,还能够自动识别并压缩符合条件的字段,从而在减少存储成本的同时,避免了对业务语句的大量修改,极大地方便了用户对特定字段进行高效压缩存储,具有较好的实际应用价值。


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 5
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
解读TaurusDB字段压缩:减少存储成本,避免语句大量修改_华为云开发者联盟_InfoQ写作社区