create table employee(id int, age int, gender boolean, other varchar(1000) primary key (id))の場合、id、age、genderなどの小さなフィールドへのアクセスが比較的頻繁で、otherなどの大きなフィールドへのアクセス頻度が低い場合、other列を圧縮列として作成できます。通常、otherへの読み書きのみがその列の圧縮と解凍をトリガーし、他の列へのアクセスはその列の圧縮と解凍をトリガーしません。これにより、行データストレージのサイズをさらに削減し、アクセス頻度の高い小さなフィールドへのより高速なアクセスを実現するとともに、アクセス頻度の低い大きなフィールドのストレージスペースをさらに削減できます。BLOB(TINYBLOB、MEDIUMBLOB、LONGBLOBを含む)TEXT(TINYTEXT、MEDIUMTEXT、LONGTEXTを含む)VARCHARVARBINARYLONGBLOBとLONGTEXTの最大長は232-2までしかサポートされておらず、公式のString Type Storage Requirementsがサポートする232-1より1バイト少なくなっています。column_definitionのCOLUMN_FORMAT定義が変更されています。また、列圧縮はInnodbストレージエンジンタイプのテーブルのみをサポートしています。column_definition:data_type [NOT NULL | NULL] [DEFAULT default_value][AUTO_INCREMENT] [UNIQUE [KEY]] [[PRIMARY] KEY][COMMENT 'string'][COLLATE collation_name][COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}|COMPRESSED=[zlib]] # COMPRESSED 圧縮列キーワード[STORAGE {DISK|MEMORY}][reference_definition]
CREATE TABLE t1(id INT PRIMARY KEY,b BLOB COMPRESSED);
CREATE TABLE t1(id INT PRIMARY KEY,b BLOB COMPRESSED=zlib);
DDL | 圧縮属性の継承 |
CREATE TABLE t2 LIKE t1; | Y |
CREATE TABLE t2 SELECT * FROM t1; | Y |
CREATE TABLE t2(a BLOB) SELECT * FROM t1; | N |
DDL | 説明 |
ALTER TABLE t1 MODIFY COLUMN a BLOB; | 圧縮列を非圧縮列に変更します。 |
ALTER TABLE t1 MODIFY COLUMN a BLOB COMPRESSED; | 非圧縮列を圧縮列に変更します。 |
パラメータ名 | 動的 | タイプ | デフォルト | パラメータ値範囲 | 説明 |
cdb_column_compression_enabled | Yes | bool | FALSE | TRUE/FALSE | 列圧縮のスイッチをオフにすると、圧縮属性を持つテーブルの新規作成は許可されません。既存の圧縮属性を持つテーブルには影響しません。 |
innodb_column_compression_zlib_wrap | Yes | bool | TRUE | TRUE/FALSE | オンにすると、データのzlibヘッダーとzlibトレーラーを生成し、adler32チェックサムを計算します。 |
innodb_column_compression_zlib_strategy | Yes | Integer | 0 | [0,4] | 列圧縮で使用される圧縮戦略です。最小値は0、最大値は4です。0から4までの値は、それぞれzlibの圧縮戦略 Z_DEFAULT_STRATEGY、Z_FILTERED、Z_HUFFMAN_ONLY、Z_RLE、Z_FIXED と一対一で対応しています。 一般的に、Z_DEFAULT_STRATEGYはテキストデータに対して最適であり、Z_RLEは画像データに対して最適です。 |
innodb_column_compression_zlib_level | Yes | Integer | 6 | [0,9] | 列圧縮で使用される圧縮レベルです。最小値は0、最大値は9です。0は圧縮なしを表し、値が大きいほど圧縮後のデータサイズは小さくなりますが、圧縮にかかる時間も長くなります。 |
innodb_column_compression_threshold | Yes | Integer | 256 | [0, 0xffffffff] | 列圧縮で使用される圧縮閾値です。最小値は1、最大値は0xffffffff、単位はバイトです。長さがこの値以上の場合のみデータが圧縮され、それ以外の場合は元のデータは変更されず、圧縮ヘッダーのみが追加されます。 |
innodb_column_compression_pct | Yes | Integer | 100 | [1, 100] | 列圧縮で使用される圧縮率です。最小値は1、最大値は100、単位はパーセントです。圧縮後のデータサイズを圧縮前のデータサイズで割った値がこの値より小さい場合のみデータが圧縮され、それ以外の場合は元のデータは変更されず、圧縮ヘッダーのみが追加されます。 |
名称 | タイプ | 説明 |
Innodb_column_compressed | Integer | 列圧縮の圧縮回数は、非圧縮形式と圧縮形式の2つのステータスにおける圧縮を含みます。 |
Innodb_column_decompressed | Integer | 列圧縮の解凍回数は、非圧縮形式と圧縮形式の2つのステータスにおける解凍を含みます。 |
名称 | 範囲 | 説明 |
Compressed column '%-.192s' can't be used in key specification | 圧縮する列名を指定します。 | インデックスが設定されている列には圧縮属性を指定できません。 |
Unknown compression method: %s | DDL文で指定された圧縮アルゴリズム名 | create table または alter table の際に、zlib 以外の無効な圧縮アルゴリズムを指定した場合です。 |
Compressed column '%-.192s' can't be used in column format specification | 圧縮する列名を指定します。 | 同一の列において、すでに COLUMN_FORMAT 属性が指定されている場合、圧縮属性を指定することはできません。なお、COLUMN_FORMAT は NDB でのみ使用されます。 |
Alter table ... discard/import tablespace not support column compression | \\ | 列圧縮が設定されているテーブルでは、 Alter table ... discard/import tablespace 文を実行できません。 |
BLOB(TINYBLOB、MEDIUMBLOB、LONGBLOBを含む)TEXT(TINYTEXT、MEDIUMTEXT、LONGTEXTを含む)VARCHARVARBINARYJSONCREATE TABLE t1(id INT PRIMARY KEY,b BLOB COMPRESSED);
CREATE TABLE t1(id INT PRIMARY KEY,b BLOB COLUMN_FORMAT COMPRESSED);
DDL | 圧縮属性の継承 |
CREATE TABLE t2 LIKE t1; | Y |
CREATE TABLE t2 SELECT * FROM t1; | N |
CREATE TABLE t2(a BLOB) SELECT * FROM t1; | N |
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] | 圧縮閾値を制御します。単位はバイトです。列の元の長さがこのパラメータの値以上の場合、圧縮が実行されます。それ以外の場合は圧縮ヘッダーのみが追加され、実際のデータは圧縮されません。 |
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]);
CREATE TABLE t2 (a VARCHAR(100) COMPRESSED) ENGINE=InnoDB;SHOW CREATE TABLE t2;
フィードバック