機能説明
現在、行形式向けの圧縮とデータページ向けの圧縮がありますが、これらの二つの圧縮方式は、一つのテーブル内のいくつかの大きいフィールドと他の多くの小さいフィールドを処理する際に、小さいフィールドへの読み書きが非常に頻繁で、大きいフィールドへのアクセスが頻繁でない状況において、読み書きアクセス時に多くの不要な計算リソースの浪費を引き起こします。
列圧縮機能は、アクセス頻度の低いサイズの大きいフィールドのみを圧縮し、アクセス頻度の高いサイズの小さいフィールドは圧縮しないように設計されています。これにより、行全体のフィールドのストレージスペースを削減できるだけでなく、読み書きアクセスの効率をさらに向上させることができます。
例えば、従業員テーブル: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です。列の元のサイズがこのパラメータの値を超える場合に圧縮を実行し、そうでない場合は圧縮ヘッダを追加するだけで、データを実際に圧縮することはありません。
サポートされる DDL 構文のまとめは以下の通りです:
create table について:
|
CREATE TABLE t2 LIKE t1;
| Y |
CREATE TABLE t2 SELECT * FROM t1;
| N |
CREATE TABLE t2(a BLOB) SELECT * FROM t1;
| N |
alter table について:
|
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] | 圧縮しきい値を制御します。単位:バイト。列の元の長さがこのパラメータの値以上の場合、圧縮を実行します。そうでない場合は、圧縮ヘッダーのみを追加して、データ自体は圧縮しません。 |
マルチアルゴリズムサポート(Multiple Algorithms)
ZLIB、LZ4、ZSTDの3つの圧縮アルゴリズムを対応しています。アルゴリズムを省略することも可能で、省略した場合のデフォルトアルゴリズムは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のページ圧縮と整合性を保つため、LZ4の多段階圧縮はサポートされていません。LZ4圧縮アルゴリズムを使用する際には注意が必要です。LZ4圧縮の最大元データ長は231-1ですが、LONGBLOBの最大長は232-1です。圧縮対象の元データ長が231以上の場合、暗黙的にZLIBが使用されます。
3. ZSTD:ZSTD(ZStandard)には3つの圧縮方式があります。ここでの列圧縮は、辞書を含まない非ストリーミングの通常圧縮をサポートしており、複数圧縮レベルを提供します。パラメータは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 for MySQL内部でサポートされています。その他のMySQL派生版および公式バージョン:
公式バージョン番号が8.0.22未満の場合、直接インポートできます。
公式バージョン番号が8.0.22以上の場合、論理エクスポート後に圧縮キーワードを削除する必要があります。
DTSで他のクラウドまたはユーザーにエクスポートする場合、binlog同期プロセス中に互換性の問題が発生する可能性があります。この場合、圧縮キーワードを含むDDL文をスキップすることができます。
物理バックアップに関しては、バックアップ時にそのフィールドがinnodb内部で圧縮済み状態であるため、このバックアップを使用するバージョンも列圧縮機能を備えたバージョンである必要があります。