tencent cloud

TencentDB for MySQL

컬럼 압축

다운로드
포커스 모드
폰트 크기
마지막 업데이트 시간: 2026-06-17 17:24:22

기능 소개

현재 행 포맷 압축과 데이터 페이지 압축이 존재하지만, 두 가지 압축 방식 모두 하나의 테이블 내에서 일부 대용량 필드와 다수의 소용량 필드를 동시에 처리할 때, 소용량 필드에 대한 읽기/쓰기가 매우 빈번하고 대용량 필드 접근은 드문 상황에서 읽기 및 쓰기 접근 시 불필요한 계산 리소스 낭비를 초래합니다.
열 압축 기능은 접근이 빈번하지 않은 대용량 필드는 압축하고, 접근이 빈번한 소용량 필드는 압축하지 않아, 이를 통해 전체 행 필드의 저장 공간을 줄일 수 있을 뿐만 아니라 읽기 및 쓰기 접근의 효율성을 향상시킬 수 있습니다.
예를 들어, 직원 테이블: 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 매개변수는 열 압축 기능의 스위치입니다.
MySQL 5.7의 열 압축 기능은 기본적으로 비활성화 상태입니다. 사용을 원하시면 티켓 제출하여 활성화하십시오.
MySQL 8.0 커널 버전 20221215 이상에서는 열 압축 기능이 기본적으로 활성화됩니다.
단일 노드(클라우드 디스크) 아키텍처의 인스턴스는 열 압축을 지원하지 않습니다.
클라우드 데이터베이스 MySQL 8.0 버전은 오픈소스 협업 버전의 열 압축 기능을 채택하여 MySQL 5.7 버전의 열 압축 구현 방식과 차이가 있습니다. 아래에서 각 버전별 열 압축 기능 사용 방법을 별도로 안내해 드리며, "MySQL 5.7 열 압축" 또는 "MySQL 8.0 열 압축"을 클릭하여 전환하여 확인하실 수 있습니다.
MySQL 5.7 열 압축
MySQL 8.0 컬럼 압축

지원 버전

커널 버전 MySQL5.7 20210330 이상

적용 시나리오

테이블에 일부 대용량 필드와 다수의 소용량 필드가 존재하면서 소용량 필드에 대한 읽기/쓰기가 매우 빈번하고 대용량 필드 접근이 드문 상황에서는 대용량 필드를 압축 열로 설정할 수 있습니다.

사용 설명

지원되는 데이터 유형

1. BLOB(TINYBLOB, MEDIUMBLOB, LONGBLOB 포함)
2. TEXT(TINYTEXT, MEDIUMTEXT, LONGTEXT 포함)
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
컬럼 압축 횟수로, 비압축 형식과 압축 형식 두 가지 상태의 압축을 포함합니다.
Innodb_column_decompressed
Integer
컬럼 압축 해제 횟수로, 비압축 형식과 압축 형식 두 가지 상태의 압축 해제를 포함합니다.

추가된 오류 설명

명칭
범위
설명
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 두 가지 측면으로 구분됩니다:
DDL 측면에서 sysbench를 사용하여 테스트를 수행합니다:
컬럼 압축은 COPY 알고리즘의 DDL 성능에 상당한 영향을 미치며, 압축 적용 후 성능은 이전보다 7배에서 8배 정도 느려졌습니다.
인플레이스(DDL)에 미치는 영향은 압축 후 데이터 크기에 따라 달라집니다. 압축 적용 후 전체 데이터 크기가 감소하면 DDL 성능이 향상되며, 반대의 경우 성능이 일정 부분 저하됩니다.
instant의 경우, 컬럼 압축은 해당 유형의 DDL에 기본적으로 영향이 없습니다.
DML 측면: 가장 일반적인 압축 시나리오(압축률 1:1.8)를 고려할 때, 8개 컬럼으로 구성된 테이블에서 하나의 큰 varchar 타입 컬럼이 존재하며, 삽입되는 데이터 길이는 1~6000 범위에서 균일하게 무작위 분포되고, 삽입되는 문자는 0~9, a~b 내에서 무작위로 생성됩니다. 나머지 컬럼은 char(60) 또는 int 타입입니다. 이 경우 비압축 컬럼에 대한 삽입, 삭제 및 조회 성능은 10% 이내로 향상되지만, 비압축 컬럼 업데이트는 10% 이내 저하되며, 압축 컬럼 업데이트는 15% 이내 성능 하락이 발생합니다. 이는 업데이트 과정에서 MySQL이 해당 행의 값을 먼저 읽고(Read) 업데이트된 값을 다시 쓰기(Write)하는 과정에서 압축 해제와 재압축이 한 번씩 발생하기 때문입니다. 반면 삽입과 조회는 단일 압축 또는 해제 작업만 수행됩니다.

주의 사항

1. 논리적 내보내기 시 create table 구문에는 여전히 Compressed 관련 키워드가 포함됩니다. 따라서 TencentDB for MySQL 내부에서는 가져오기가 지원됩니다. 기타 MySQL 포크 및 공식 버전의 경우:
공식 버전이 5.7.18 미만인 경우 직접 가져올 수 있습니다.
공식 버전이 5.7.18 이상인 경우, 논리적 내보내기 후 압축 키워드를 제거해야 합니다.
2. DTS가 다른 클라우드 또는 사용자에게 데이터를 내보낼 때, binlog 동기화 과정에서 호환성 문제가 발생할 수 있습니다. 압축 키워드가 포함된 DDL 구문은 건너뛸 수 있습니다.
3. 컬럼 압축은 zlib 압축 알고리즘을 사용하여 데이터를 압축하지만, 이미 압축된 데이터에 컬럼 압축을 적용하면 일반적으로 압축 효과가 크게 향상되지 않습니다. 예를 들어 JPEG 형식의 이미지는 고도로 최적화된 손실 압축 형식으로, 이미지 데이터를 작은 파일 크기로 압축하였습니다. 이러한 이유로 실제 사용에서 JPEG 데이터에 컬럼 압축을 적용하는 것은 효과적이지 않습니다.

지원 버전

커널 버전 MySQL8.0 20221215 이상

적용 시나리오

테이블에 일부 대용량 필드와 다수의 소용량 필드가 존재하면서 소용량 필드에 대한 읽기/쓰기가 매우 빈번하고 대용량 필드 접근이 드문 경우, 대용량 필드를 압축 열로 설정할 수 있습니다.

사용 설명서

지원되는 데이터 유형

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 관련 사항:
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)

클라우드 데이터베이스 MySQL 8.0 버전은 ZLIB, LZ4, ZSTD 세 가지 압축 알고리즘을 지원합니다. 알고리즘을 생략할 수도 있으며, 생략할 경우 기본 알고리즘은 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는 세 가지 압축 방식을 지원합니다. 여기서 열 압축은 딕셔너리를 포함하지 않은 비스트리밍 일반 압축을 지원하며, 다중 압축 레벨을 제공합니다. 매개변수는 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. MySQL 5.7에서 MySQL 8.0으로의 물리적 업그레이드는 지원하지 않습니다.
5. 컬럼 압축은 ZLIB, LZ4, ZSTD 압축 알고리즘을 사용하여 데이터를 압축하지만, 이미 압축된 데이터에 컬럼 압축을 적용하면 일반적으로 압축 효과가 크게 향상되지 않습니다. 예를 들어 JPEG 형식의 이미지는 고도로 최적화된 손실 압축 형식으로, 이미지 데이터를 작은 파일 크기로 압축하였습니다. 이러한 이유로 실제 사용에서 JPEG 데이터에 컬럼 압축을 적용하는 것은 효과적이지 않습니다.


도움말 및 지원

문제 해결에 도움이 되었나요?

피드백