为了提高列存模式下的压缩效率,降低存储成本,您可以为创建的列存索引设置压缩算法。本文介绍如何设置和修改列存索引的压缩算法。

支持的压缩算法

当前PolarDB MySQL引擎支持两种IMCI的压缩算法:LZ4压缩、ZSTD压缩。

  • LZ4:一种无损数据压缩算法,压缩速度大于每核500 MB/s。具体可参见LZ4 GitHub
  • ZSTD(全称Zstandard):一种无损数据压缩算法,压缩速度与LZ4相当。具体可参见Zstandard GitHub

建表时设置压缩算法

  • 语法:

    在建表时,您只需要在CREATE TABLE语句的COMMENT字段里设置codec_opt参数,即可设置IMCI的压缩算法。

    COMMENT 'COLUMNAR=1 codec_opt={LZ4}'

    codec_opt有效的取值为LZ4ZSTDNONE,对应LZ4压缩、ZSTD压缩和不使用压缩。

    说明
    • imci_default_codec参数定义了缺省压缩算法。当COMMENT中缺省codec_opt时,将根据该参数的值采用对应的压缩算法。该参数默认值为ZSTD
    • 您可以执行SET命令在SESSION级别修改imci_default_codec的值,或者提交工单申请全局性修改该值。

    在表的COMMENT字段中指定的压缩算法将应用在表的所有列索引上。如果同时在列的COMMENT中设置了压缩算法,将以列的配置优先。

  • 示例:

    CREATE TABLE t12(
      col1 INT,
      col2 DATETIME,
      col3 VARCHAR(200)
    ) ENGINE InnoDB COMMENT 'COLUMNAR=1 codec_opt={LZ4}';
    
    SET imci_default_codec="{LZ4}";
    
    CREATE TABLE t13(
      col1 INT COMMENT 'codec_opt={NONE}',
      col2 DATETIME,
      col3 VARCHAR(200) 'codec_opt={ZSTD}',
    ) ENGINE InnoDB COMMENT 'COLUMNAR=1';

    从以上示例中可以看到:

    • t12使用COMMENT字段指定了表的默认压缩算法为LZ4。col1、col2和col3列的数据都使用LZ4算法进行压缩。
    • t13未设置表的压缩算法,col1单独配置为不开启压缩;col2未设置codec_opt,将使用参数imci_default_codec配置的压缩算法,使用LZ4算法压缩;col3设置codec_opt={ZSTD},由于列的配置优先级高于表以及默认配置,因此col3使用ZSTD压缩算法。

修改列的压缩算法

目前尚不支持修改单列数据的压缩算法。若要修改,需要删除原来的数据,再使用新的建表语句,指定列的新压缩算法。修改单列数据的压缩方式将在后续版本中推出。

示例:

CREATE TABLE t14(
  col1 INT COMMENT 'COLUMNAR=1 codec_opt={ZSTD}',
  col2 DATETIME COMMENT 'COLUMNAR=1 codec_opt={ZSTD}',
  col3 VARCHAR(200)
) ENGINE InnoDB;

-- 修改列存索引的压缩算法
ALTER TABLE t14 COMMENT 'COLUMNAR=1', MODIFY COLUMN col2 DATETIME COMMENT 'codec_opt={LZ4}';

在以上示例中,表t14的col2列上已经建立列索引,压缩算法为ZSTD。若执行示例中的命令尝试将其修改为LZ4,不会立即生效,需要重建数据时才会生效。由于该命令不会触发数据重建,因此数据(包括后续新增数据)仍使用之前的指定的压缩方式。