列压缩

最近更新时间:2024-12-02 16:02:22

我的收藏

功能介绍

当前存在两种压缩方式:针对行格式的压缩和针对数据页面的压缩。然而,在处理一个表中既包含某些大字段又包含许多小字段的情况下,尤其是当频繁读写小字段而不常访问大字段时,这两种压缩方式都会产生不必要的计算资源浪费。
列压缩功能可以压缩那些访问不频繁的大字段而不压缩那些访问频繁的小字段,这样不仅能够减少整行字段的存储空间,而且可以提高读写访问的效率。
例如,一张员工表:create table employee(id int, age int, gender boolean, other varchar(1000) primary key (id)),当对 id,age,gender 小字段访问比较频繁,而对 other 大字段的访问频率比较低时,可以将 other 列创建为压缩列。一般情况下,只有对 other 的读写才会触发对该列的压缩和解压,对其他列的访问并不会触发该列的压缩和解压。由此进一步降低了行数据存储的大小,使得对访问频繁的小字段能够实现更快访问,对访问频率比较低的大字段的存储空间能够实现进一步降低。

支持版本

内核版本 TXSQL 8.0 3.1.15.002及以上。
说明:
内核版本 TXSQL 8.0 3.1.15.002及以上的列压缩功能为默认开启。
内核版本 TXSQL 5.7 暂不支持列压缩功能。

适用场景

表中如果存在一些大字段和许多小字段,且对小字段的读写操作较为频繁,而对大字段的访问较少,可以考虑将大字段设置为压缩列。

使用说明

支持的数据类型

1. BLOB(包含 TINYBLOB、MEDIUMBLOB、LONGBLOB)。
2. TEXT(包含 TINYTEXT、MEDIUMTEXT、LONGTEXT)。
3. VARCHAR。
4. VARBINARY。
5. JSON。
语法如下:
CREATE TABLE t1(
id INT PRIMARY KEY,
b BLOB COMPRESSED
);
或者
CREATE TABLE t1(
id INT PRIMARY KEY,
b BLOB COLUMN_FORMAT COMPRESSED
);
压缩阈值(Threshold)
压缩阈值通过参数 innodb_min_column_compress_length 控制,默认为256。如果列的原 size 超过此参数的取值,则进行压缩,否则只添加压缩 header,不对数据进行实际压缩。
支持的 DDL 语法总结如下:
create table 方面:
DDL
是否继承压缩属性
CREATE TABLE t2 LIKE t1;
Y
CREATE TABLE t2 SELECT * FROM t1;
N
CREATE TABLE t2(a BLOB) SELECT * FROM t1;
N
alter table 方面:
DDL
描述
ALTER TABLE t1 MODIFY COLUMN a BLOB;
将压缩列变为非压缩列
ALTER TABLE t1 MODIFY COLUMN a BLOB COMPRESSED;
将非压缩列变为压缩列

参数说明

参数名
动态
类型
默认
参数值范围
说明
innodb_zlib_column_compression_level
Yes
UINT
6
[0-9]
zlib 压缩,0表示不压缩,1表示最快的压缩,9表示压缩程度最大的压缩,从1到9压缩速度越慢,但压缩率越高。
innodb_zstd_column_compression_level
Yes
UINT
3
[1-22]
zstd 压缩,1表示最快的压缩,22表示压缩程度最大的压缩,从1到22压缩速度越慢,但压缩率越高。
innodb_min_column_compress_length
Yes
UINT
256
[1,UINT_MAX32]
控制压缩阈值,单位:字节,如果列的原长度大于或等于此参数的取值,则进行压缩,否则只添加压缩 header,实际不对数据进行压缩。

多算法支持(Multiple Algorithms)

支持 ZLIB、LZ4、ZSTD 三种压缩算法。也可以省略算法,省略后将默认算法为 ZLIB。
语法如下:
CREATE TABLE t1(
id INT PRIMARY KEY,
b BLOB COMPRESSED ALGORITHM = [ZLIB|LZ4|ZSTD]
);
或者
CREATE TABLE t1(
id INT PRIMARY KEY,
b BLOB COLUMN_FORMAT COMPRESSED ALGORITHM = [ZLIB|LZ4|ZSTD]
);

压缩算法与压缩程度选择(Compression Algorithms and Compression Levels)

1. ZLIB:目前提供了 ZLIB 的多压缩级别,参数为 innodb_zlib_column_compression_level,值为0-9,其中0表示不压缩,1表示最快的压缩,9表示压缩程度最大的压缩,默认为6。
2. LZ4:与 MySQL 的 Page 压缩保持一致,不支持 LZ4 的多程度压缩,使用 LZ4 压缩算法时需要注意,LZ4 压缩的最大原始长度为231-1,而 LONGBLOB 的最大长度为232-1,当压缩的原始数据长度大于等于231时,将会隐式地使用 ZLIB 进行压缩。
3. ZSTD:ZSTD 即 ZStandard 有三种压缩方式。此处列压缩支持的是不含字典的非 streaming 的普通压缩,提供了多压缩级别,参数为 innodb_zstd_column_compression_level,值为1-22,1表示最快的压缩,22表示压缩程度最大的压缩,默认为3。
压缩属性显示
这里展示默认压缩算法:ALGORITHM = ZLIB。
CREATE TABLE t2 (a VARCHAR(100) COMPRESSED) ENGINE=InnoDB;

SHOW CREATE TABLE t2;

注意事项

逻辑导出方面,逻辑导出时 create table 还是会附有 Compressed 相关的关键字。因此导入时在 TDSQL-C MySQL 版内部是支持的。其他 MySQL 分支以及官方版本:
官方版本号小于8.0.22,可以直接导入。
官方版本号大于或等于8.0.22,需要在逻辑导出之后,去掉压缩关键字。
DTS 导出其他云或者用户时,在 binlog 同步过程中可能会出现不兼容的问题,此时可以跳过带压缩关键字的 DDL 语句。
物理备份方面,由于备份时其字段在 innodb 内部是已经压缩的状态,因此使用该备份的版本也必须是带有列压缩的版本。