設(shè)置列存數(shù)據(jù)壓縮算法
為了提高列存模式下的壓縮效率,降低存儲成本,您可以為創(chuàng)建的列存索引設(shè)置壓縮算法。本文介紹如何設(shè)置和修改列存索引的壓縮算法。
支持的壓縮算法
當(dāng)前PolarDB MySQL版支持兩種IMCI的壓縮算法:LZ4壓縮、ZSTD壓縮。
LZ4:一種無損數(shù)據(jù)壓縮算法,壓縮速度大于每核500 MB/s。具體可參見LZ4 GitHub。
ZSTD(全稱Zstandard):一種無損數(shù)據(jù)壓縮算法,壓縮速度與LZ4相當(dāng)。具體可參見Zstandard GitHub。
建表時(shí)設(shè)置壓縮算法
語法:
在建表時(shí),您只需要在CREATE TABLE語句的COMMENT字段里設(shè)置codec_opt參數(shù),即可設(shè)置IMCI的壓縮算法。
COMMENT 'COLUMNAR=1 codec_opt={LZ4}'
codec_opt有效的取值為
LZ4
、ZSTD
和NONE
,對應(yīng)LZ4壓縮、ZSTD壓縮和不使用壓縮。說明imci_default_codec參數(shù)定義了缺省壓縮算法。當(dāng)COMMENT中缺省codec_opt時(shí),將根據(jù)該參數(shù)的值采用對應(yīng)的壓縮算法。該參數(shù)默認(rèn)值為
ZSTD
。您可以執(zhí)行SET命令在SESSION級別修改imci_default_codec的值。
在表的COMMENT字段中指定的壓縮算法將應(yīng)用在表的所有列索引上。如果同時(shí)在列的COMMENT中設(shè)置了壓縮算法,將以列的配置優(yōu)先。
示例:
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字段指定了表的默認(rèn)壓縮算法為LZ4。col1、col2和col3列的數(shù)據(jù)都使用LZ4算法進(jìn)行壓縮。表
t13
未設(shè)置表的壓縮算法,col1單獨(dú)配置為不開啟壓縮;col2未設(shè)置codec_opt,將使用參數(shù)imci_default_codec配置的壓縮算法,使用LZ4算法壓縮;col3設(shè)置codec_opt={ZSTD},由于列的配置優(yōu)先級高于表以及默認(rèn)配置,因此col3使用ZSTD壓縮算法。
修改列的壓縮算法
目前尚不支持修改單列數(shù)據(jù)的壓縮算法。若要修改,需要?jiǎng)h除原來的數(shù)據(jù),再使用新的建表語句,指定列的新壓縮算法。修改單列數(shù)據(jù)的壓縮方式將在后續(xù)版本中推出。
示例:
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列上已經(jīng)建立列索引,壓縮算法為ZSTD。若執(zhí)行示例中的命令嘗試將其修改為LZ4,不會(huì)立即生效,需要重建數(shù)據(jù)時(shí)才會(huì)生效。由于該命令不會(huì)觸發(fā)數(shù)據(jù)重建,因此數(shù)據(jù)(包括后續(xù)新增數(shù)據(jù))仍使用之前的指定的壓縮方式。