tencent cloud

TencentDB for MySQL

列圧縮

ダウンロード
フォーカスモード
フォントサイズ
最終更新日: 2026-06-17 17:23:52

機能説明

現在、行フォーマット向けの圧縮とデータページ向けの圧縮があります。しかし、これらの2つの圧縮方式は、1つのテーブル内に存在する一部の大きなフィールドと多数の小さなフィールドを扱う場合、小さなフィールドへの読み書きが頻繁で、大きなフィールドへのアクセスが少ないシナリオでは、読み書きアクセス時に多くの不要な計算リソースの浪費を引き起こします。
列圧縮機能は、アクセス頻度の低い大きなフィールドを圧縮し、アクセス頻度の高い小さなフィールドは圧縮しません。これにより、行全体のフィールドのストレージスペースを削減できるだけでなく、読み書きアクセスの効率を向上させることができます。
例えば、従業員テーブル:create table employee(id int, age int, gender boolean, other varchar(1000) primary key (id))の場合、id、age、genderなどの小さなフィールドへのアクセスが比較的頻繁で、otherなどの大きなフィールドへのアクセス頻度が低い場合、other列を圧縮列として作成できます。通常、otherへの読み書きのみがその列の圧縮と解凍をトリガーし、他の列へのアクセスはその列の圧縮と解凍をトリガーしません。これにより、行データストレージのサイズをさらに削減し、アクセス頻度の高い小さなフィールドへのより高速なアクセスを実現するとともに、アクセス頻度の低い大きなフィールドのストレージスペースをさらに削減できます。
説明:
パラメータ cdb_column_compression_enabled は、列圧縮機能のスイッチです。
MySQL5.7の列圧縮機能はデフォルトで無効になっています。使用する場合は、作業依頼書を提出して有効化してください。
MySQL8.0カーネルバージョン20221215以上の列圧縮機能はデフォルトで有効になっています。
シングルノード(クラウドディスク)アーキテクチャのインスタンスは、列圧縮をサポートしていません。
TencentDB for MySQL 8.0バージョンはオープンソースコラボレーションバージョンの列圧縮機能を採用しており、MySQL5.7バージョンの列圧縮の実装とは異なります。以下では、2つのバージョンの列圧縮機能の使用説明をそれぞれご紹介します。「MySQL5.7列圧縮」または「MySQL8.0列圧縮」をクリックして切り替えてご確認ください。
MySQL5.7列圧縮
MySQL8.0列圧縮

サポートバージョン

カーネルバージョン MySQL5.7 20210330以上

適用シーン

テーブルに一部の大きなフィールドと多数の小さなフィールドが存在し、小さなフィールドへの読み書きが頻繁で、大きなフィールドへのアクセスが少ない場合、大きなフィールドを圧縮列として設定できます。

使用説明

サポートデータタイプ

1. BLOBTINYBLOBMEDIUMBLOBLONGBLOBを含む)
2. TEXTTINYTEXTMEDIUMTEXTLONGTEXTを含む)
3. VARCHAR
4. VARBINARY
注意:
LONGBLOBLONGTEXTの最大長は232-2までしかサポートされておらず、公式のString Type Storage Requirementsがサポートする232-1より1バイト少なくなっています。

サポートDDL構文タイプ

公式のテーブル作成構文と比較して、column_definitionCOLUMN_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
);
この場合、圧縮アルゴリズムは省略され、デフォルトでzlib圧縮アルゴリズムが選択されます。圧縮アルゴリズムキーワードを明示的に指定することもできますが、現在サポートされているのはzlib圧縮アルゴリズムのみです。
CREATE TABLE t1(
id INT PRIMARY KEY,
b BLOB COMPRESSED=zlib
);
サポートされているDDL構文のまとめは以下の通りです:
create table 関連:
DDL
圧縮属性の継承
CREATE TABLE t2 LIKE t1;
Y
CREATE TABLE t2 SELECT * FROM t1;
Y
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;
非圧縮列を圧縮列に変更します。

パラメータ説明

パラメータ名
動的
タイプ
デフォルト
パラメータ値範囲
説明
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 文を実行できません。

パフォーマンス

全体のパフォーマンスはDDLとDMLの2つの側面に分かれます:
DDLの側面では、sysbenchを使用してテストを行います:
列圧縮はCOPYアルゴリズムのDDLに大きなパフォーマンス影響を与え、圧縮後のパフォーマンスは以前よりも7倍から8倍遅くなります。
inplaceへの影響は、圧縮後のデータ量の大きさによって決まります。圧縮後に全体のデータサイズが減少した場合、DDLのパフォーマンスは向上します。逆に、データサイズが増加した場合は、パフォーマンスが一定の低下を示します。
instantの場合、列圧縮はこのタイプのDDLにほとんど影響を与えません。
DMLの側面:最も一般的な圧縮シナリオ(圧縮比1:1.8)を考慮します。この場合、8つの列を持つテーブルがあり、その中に大きなvarchar型の列が1つ存在します。この列への挿入データの長さは1から6000の範囲で均一にランダムで、挿入される文字は0から9、aからbの範囲でランダムです。他のいくつかの列のデータ型はchar(60)またはint型です。この状況では、非圧縮列への挿入、削除、照会には10%以内の向上が見られますが、非圧縮列の更新には10%以内の低下、圧縮列の更新には15%以内のパフォーマンス低下が見られます。これは、更新プロセスにおいて、MySQLがまずその行の値を読み出し、その後更新後の値を書き込むためです。更新プロセス全体で1回の解凍と圧縮がトリガーされますが、挿入と照会では圧縮または解凍が1回のみ行われるためです。

注意事項

1. 論理エクスポートの側面では、論理エクスポート時にcreate tableには依然としてCompressed関連のキーワードが付与されます。そのため、インポート時にはTencentDB for MySQL内部でサポートされています。その他のMySQL派生版および公式バージョン:
公式バージョン番号が5.7.18未満の場合、直接インポートできます。
公式バージョン番号が5.7.18以上の場合、論理エクスポート後に圧縮キーワードを削除する必要があります。
2. DTSが他のクラウドまたはユーザーをエクスポートする際、binlogの同期プロセスで互換性の問題が発生する可能性があります。その場合は、圧縮キーワードを含むDDLステートメントをスキップできます。
3. 列圧縮はzlib圧縮アルゴリズムを使用してデータを圧縮しますが、既に圧縮されているデータに対して列圧縮を行っても、圧縮効果が大幅に向上することは通常ありません。JPEG形式の画像を例に挙げると、JPEGは高度に最適化された非可逆圧縮形式であり、画像データを小さなファイルサイズに圧縮しています。そのため、実際の使用において、JPEGデータに対する列圧縮の効果は理想的ではありません。

サポートバージョン

カーネルバージョン MySQL8.0 20221215以上

適用シーン

テーブルに一部の大きなフィールドと多数の小さなフィールドが存在し、小さなフィールドへの読み書きが頻繁で、大きなフィールドへのアクセスが少ない場合、大きなフィールドを圧縮列として設定できます。

使用説明

サポートデータタイプ

1. BLOBTINYBLOBMEDIUMBLOBLONGBLOBを含む)
2. TEXTTINYTEXTMEDIUMTEXTLONGTEXTを含む)
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 関連:
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]
圧縮閾値を制御します。単位はバイトです。列の元の長さがこのパラメータの値以上の場合、圧縮が実行されます。それ以外の場合は圧縮ヘッダーのみが追加され、実際のデータは圧縮されません。

マルチアルゴリズムサポート(Multiple Algorithms)

TencentDB for MySQL 8.0バージョンは、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です。圧縮する元データの長さがgreater than or equal to 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;

注意事項

1. 論理エクスポートの側面では、論理エクスポート時にcreate tableには依然としてCompressed関連のキーワードが付与されます。そのため、インポート時にはTencentDB for MySQL内部でサポートされています。その他のMySQL派生版および公式バージョン:
公式バージョン番号が8.0.22未満の場合、直接インポートできます。
公式バージョン番号が8.0.22以上の場合、論理エクスポート後に圧縮キーワードを削除する必要があります。
2. DTSが他のクラウドまたはユーザーをエクスポートする際、binlogの同期プロセスで互換性の問題が発生する可能性があります。その場合は、圧縮キーワードを含むDDLステートメントをスキップできます。
3. 物理バックアップの側面では、バックアップ時にそのフィールドがinnodb内部ですでに圧縮されたステータスであるため、このバックアップを使用するバージョンも列圧縮を備えたバージョンである必要があります。
4. MySQL5.7からMySQL8.0への物理アップグレードはサポートされていません。
5. 列圧縮はZLIB、LZ4、ZSTD圧縮アルゴリズムを使用してデータを圧縮しますが、既に圧縮されているデータに対して列圧縮を行っても、圧縮効果が大幅に向上することは通常ありません。JPEG形式の画像を例に挙げると、JPEGは高度に最適化された非可逆圧縮形式であり、画像データを小さなファイルサイズに圧縮しています。そのため、実際の使用において、JPEGデータに対する列圧縮の効果は理想的ではありません。


ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック