解读 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 语句:
对 t1 表中的三列显式添加压缩属性,并对 c3 列单独指定压缩算法为 ZSTD,查看显式压缩添加的压缩属性,如图 7 所示。
图 7 查看压缩属性
自动压缩 [rds_column_compression=2]
例如,自动地创建压缩字段(如图 8,设置字段压缩阈值参数 rds_column_compression_threshold=100,设置默认压缩算法参数 rds_default_column_compression_algorithm=ZLIB),SQL 语句不需要改造,自动对符合条件的列添加压缩属性。
图 8 自动压缩参数设置
执行如下 SQL 语句:
系统将自动为 t2 表的 c2 列添加压缩属性,使用 rds_default_column_compression_algorithm 参数值作为默认压缩算法,查看自动压缩添加的压缩属性,如图 9 所示。
图 9 查看压缩属性
关闭压缩 [rds_column_compression=0]
关闭特性后,无法再继续对列添加压缩属性,设置参数如图 10 所示。
图 10 关闭压缩参数设置
执行如下 SQL 语句:
即便已对列添加压缩属性,但实际不生效,关闭效果如图 11 所示。
图 11 查看关闭效果
观察效果
通过展示表结构信息,如果发现其中包含/*!99990 800220201 COMPRESSED=xxxx */的注释内容,可认为该表中的某些字段已使用字段压缩特性,例如:
利用系统视图 information_schema.columns 查询压缩字段,执行如下 SQL 语句,
查看当前所有的字段压缩列信息,结果如图 12 所示:
图 12 通过系统视图查询压缩字段
通过查询 status 信息,来确认字段压缩/解压缩接口的实际调用次数。例如,在将参数设置为 rds_column_compression_threshold=20 之后,对上述 t1 表进行插入数据以及查询数据操作,执行如下 SQL 语句,
观察压缩/解压缩接口调用情况,结果如图 13 所示:
图 13 查看压缩/解压缩接口调用情况
在表数据占用的存储空间较大时,可以通过查看监控界面信息来对比压缩前后存储占用大小,用于确认压缩效果。
5.总结
为了验证字段压缩的应用效果,通过构造两种场景来进行对比实验。
场景一如下所示。表中有 1 万行数据,每行数据是由 400 个 MD5 函数返回的 32 位字符串构成。
场景二如下所示,通过 sysbench 导入 64 张表,每张表包含 1000 万行数据,其中 c 和 pad 字段的数据类型被更改为 varchar。
通过将`rds_column_compression`参数分别设置为 0(表示不压缩)和 2(表示启用压缩),并在保持其他参数为默认值的情况下,我们在两种不同的场景进行了对比测试。结果显示,对于场景一,表压缩前后的存储大小比约为 1.8,而场景二的这一比值则约为 1.2,且压缩后的性能损耗最高在 10%左右。
这表明,TaurusDB 的字段压缩功能,不仅支持用户根据需求进行自选压缩算法等操作,实现细粒度的压缩策略调整,还能够自动识别并压缩符合条件的字段,从而在减少存储成本的同时,避免了对业务语句的大量修改,极大地方便了用户对特定字段进行高效压缩存储,具有较好的实际应用价值。
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/9f4cebbef41221802606a9c7d】。文章转载请联系作者。
评论