[MySQL][InnoDB] 페이지 압축

■ InnoDB Page Compression

InnoDB 테이블당 파일 테이블 스페이스에 있는 테이블에 대한 페이지 레벨 압축을 지원합니다. 기능을 무결성 혹은 명료한(Transparent) 페이지 압축이라고합니다. CREATE TABLE 또는 ALTER TABLE 사용하여 COMPRESSION 속성을 지정하면 페이지 압축이 사용 가능합니다. 지원되는 압축 알고리즘에는 Zlib LZ4 있습니다.

 

지원되는 플랫폼

페이지 압축에는 스파스 파일 펀치 지원이 필요합니다. 페이지 압축은 NTFS 사용하는 Windows 커널 수준에서 펀치 지원을 제공하는 MySQL 지원 Linux 플랫폼의 다음 하위 집합에서 지원됩니다.

스파스 파일이란? :

펀치란? : 

 

+ RHEL 7 커널 버전 3.10.0-123 이상을 사용하는 파생 배포판

+ OEL 5.10 (UEK2) 커널 버전 2.6.39 이상

+ OEL 6.5 (UEK3) 커널 버전 3.8.13 이상

+ OEL 7.0 커널 버전 3.8.13 이상

+ SLE11 커널 버전 3.0-x

+ SLE12 커널 버전 3.12-x

+ OES11 커널 버전 3.0-x

+ 우분투 14.0.4 LTS 커널 버전 3.13 이상

+ 우분투 12.0.4 LTS 커널 버전 3.2 이상

+ 데비안 7 커널 버전 3.2 이상

 

참고

특정 Linux 배포판에서 사용 가능한 모든 파일 시스템이 펀치를 지원하지 않을 있습니다.

 

페이지 압축 작동 방식

페이지가 작성되면 지정된 압축 알고리즘을 사용하여 압축됩니다. 압축된 데이터는 디스크에 기록되며, 펀칭 메커니즘은 페이지 끝에서 블록을 해제합니다. 압축이 실패하면 데이터는 있는 그대로 기록됩니다.

 

 

 

▶ Linux에서  펀치 크기

Linux 시스템에서 파일 시스템 블록 크기는 펀칭에 사용되는 단위 크기입니다. 따라서 페이지 압축은 InnoDB 페이지 크기에서 파일 시스템 블록 크기를 크기 이하로 압축 있는 경우에만 작동합니다. 예를 들어, innodb_page_size = 16K이고 파일 시스템 블록 크기가 4K 경우 펀치가 가능하도록 페이지 데이터를 12K 이하로 압축해야 합니다.

 

▶ Windows에서 펀치 크기

Windows 시스템에서 스파스 파일의 기본 인프라는 NTFS 압축을 기반으로합니다. 펀칭 크기는 NTFS 압축 장치로 NTFS 클러스터 크기의 16배입니다. 클러스터 크기 압축 단위는 다음 표에 나와 있습니다.

 

14.8 Windows NTFS 클러스터 크기 압축 단위

Cluster Size Compression Unit
512 Bytes 8 KB
1 KB 16 KB
2 KB 32 KB
4 KB 64 KB

 

 

Windows 시스템에서 페이지 압축은 페이지 데이터를 InnoDB 페이지 크기에서 압축 단위 크기를 크기 이하로 압축 있는 경우에만 작동합니다.

 

기본 NTFS 클러스터 크기는 4KB이며 압축 단위 크기는 64KB입니다. 이는 최대 innodb_page_size 64KB이므로 페이지 압축은 기본 제공 Windows NTFS 구성에 이점이 없음을 의미합니다.

 

Windows에서 페이지 압축이 작동하려면 파일 시스템을 4K보다 작은 클러스터 크기로 작성해야하며 innodb_page_size 압축 단위 크기의 이상이어야 합니다. 예를 들어, Windows에서 페이지 압축이 작동하려면 클러스터 크기가 512바이트 (압축 단위가 8KB) 파일 시스템을 빌드하고 innodb_page_size값이 16K 이상인 InnoDB 초기화 있습니다.

 

페이지 압축 활성화

페이지 압축을 사용 가능하게하려면 CREATE TABLE 문에서 COMPRESSION 속성을 지정합니다. 예를 들면 다음과 같습니다.

CREATE TABLE t1 (c1 INT) COMPRESSION="zlib";

 

ALTER TABLE 문에서 페이지 압축을 사용할 수도 있습니다. 그러나 ALTER TABLE ... COMPRESSION 테이블 스페이스 압축 속성만 업데이트합니다. 압축 알고리즘을 설정 발생하는 테이블 공간에 설정을 사용하지만 기존 페이지에 압축 알고리즘을 적용하려면 OPTIMIZE TABLE 사용하여 테이블을 다시 작성해야합니다.

ALTER TABLE t1 COMPRESSION="zlib";
OPTIMIZE TABLE t1;

 

페이지 압축 비활성화

페이지 압축을 비활성화하려면 ALTER TABLE 사용하여 COMPRESSION = None 설정합니다. COMPRESSION = None 설정한 발생하는 테이블 공간에 이상 페이지 압축을 사용하지 않습니다. 기존 페이지를 압축 해제하려면 COMPRESSION = None 설정한 OPTIMIZE TABLE 사용하여 테이블을 다시 작성해야합니다.

ALTER TABLE t1 COMPRESSION="None";
OPTIMIZE TABLE t1;

 

페이지 압축 메타 데이터

페이지 압축 메타 데이터는 INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES 테이블의 다음 열에 있습니다.

 

+ FS_BLOCK_SIZE : 파일 시스템 블록 크기. 펀칭에 사용되는 단위 크기입니다.

+ FILE_SIZE : 파일의 겉보기 크기. 압축되지 않은 파일의 최대 크기를 나타냅니다.

+ ALLOCATED_SIZE : 파일의 실제 크기이며 디스크에 할당 공간입니다.

 

참고

Unix 유사한 시스템에서 ls -l tablespace_name.ibd 명백한 파일 크기 (FILE_SIZE 동일) 바이트 단위로 표시합니다. 디스크에 할당 실제 공간 (ALLOCATED_SIZE 동일) 보려면 --block-size = 1 tablespace_name.ibd 사용하십시오. --block-size = 1 옵션은 할당 공간을 블록 대신 바이트 단위로 인쇄하므로 ls -l 출력과 비교할 있습니다.

 

SHOW CREATE TABLE 사용하여 현재 페이지 압축 설정 (Zlib, Lz4 또는 None) 봅니다. 표에는 압축 설정이 다른 여러 페이지가 혼합되어있을 있습니다.

 

다음 예에서 직원 테이블의 페이지 압축 메타 데이터는 INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES 테이블에서 검색됩니다.

# Zlib 페이지 압축으로 직원 테이블 만들기
CREATE TABLE employees (
    emp_no      INT             NOT NULL,
    birth_date  DATE            NOT NULL,
    first_name  VARCHAR(14)     NOT NULL,
    last_name   VARCHAR(16)     NOT NULL,
    gender      ENUM ('M','F')  NOT NULL,  
    hire_date   DATE            NOT NULL,
    PRIMARY KEY (emp_no)
) COMPRESSION="zlib";

# Insert data (not shown)

# INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES의 쿼리 페이지 압축 메타 데이터  
mysql> SELECT SPACE, NAME, FS_BLOCK_SIZE, FILE_SIZE, ALLOCATED_SIZE FROM
       INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE NAME='employees/employees'\G
*************************** 1. row ***************************
SPACE: 45
NAME: employees/employees
FS_BLOCK_SIZE: 4096
FILE_SIZE: 23068672
ALLOCATED_SIZE: 19415040

 

직원 테이블의 페이지 압축 메타 데이터는 실제 파일 크기 (페이지 압축 포함) 19415040 바이트인 것으로 보이며 파일 크기는 23068672 바이트입니다. 파일 시스템 블록 크기는 4096 바이트이며 펀칭에 사용되는 블록 크기입니다.

 

 

 

페이지 압축을 사용하여 테이블 식별

페이지 압축이 사용 가능한 테이블을 식별하기 위해 COMPRESSION 속성으로 정의된 테이블에 대한 INFORMATION_SCHEMA.TABLES CREATE_OPTIONS 컬럼을 조회할 있습니다.

mysql> SELECT TABLE_NAME, TABLE_SCHEMA, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES 
       WHERE CREATE_OPTIONS LIKE '%COMPRESSION=%';
+------------+--------------+--------------------+
| TABLE_NAME | TABLE_SCHEMA | CREATE_OPTIONS     |
+------------+--------------+--------------------+
| employees  | test         | COMPRESSION="zlib" |
+------------+--------------+--------------------+

SHOW CREATE TABLE 또한 압축속성이 설정되어 있다면 표시됩니다.

 

페이지 압축 제한 사용법 참고 사항

+ 파일 시스템 블록 크기 (또는 Windows 압축 단위 크기) * 2> innodb_page_size 경우 페이지 압축이 비활성화됩니다.

+ 시스템 테이블 스페이스, 임시 테이블 스페이스 일반 테이블 스페이스를 포함하는 공유 테이블 스페이스에 있는 테이블에는 페이지 압축이 지원되지 않습니다.

+ 언두 로그 테이블 스페이스에는 페이지 압축이 지원되지 않습니다.

+ 리두 로그 페이지에는 페이지 압축이 지원되지 않습니다.

+ 공간 인덱스에 사용되는 R-트리 페이지는 압축되지 않습니다.

+ 압축 테이블에 속하는 페이지 (ROW_FORMAT = COMPRESSED) 그대로 유지됩니다.

+ 복구 중에 업데이트 페이지는 압축되지 않은 형식으로 작성됩니다.

+ 사용된 압축 알고리즘을 지원하지 않는 서버에서 페이지 압축 테이블 스페이스를 로드하면 I/O 오류가 발생합니다.

+ 페이지 압축을 지원하지 않는 이전 버전의 MySQL 다운 그레이드하기 전에 페이지 압축 기능을 사용하는 테이블을 압축 해제해야 합니다. 테이블을 압축 해제하려면 ALTER TABLE ... COMPRESSION = None OPTIMIZE TABLE 실행하세요.

+ 사용된 압축 알고리즘이 서버에서 모두 사용 가능한 경우 Linux Windows 서버간에 페이지 압축 테이블 스페이스를 복사 있습니다.

+ 페이지 압축 테이블 스페이스 파일을 호스트에서 다른 호스트로 이동할 페이지 압축을 유지하려면 스파스 파일을 보존하는 유틸리티가 필요합니다.

+ NVMFS 펀치 기능을 이용하도록 설계 되었기 때문에 다른 플랫폼보다 NVMFS가있는 Fusion-io 하드웨어에서 나은 페이지 압축이 이루어질 있습니다.

+ InnoDB 페이지 크기가 크고 파일 시스템 블록 크기가 비교적 작은 페이지 압축 기능을 사용하면 쓰기가 증폭 있습니다. 예를 들어, 4KB 파일 시스템 블록 크기에서 최대 64KB InnoDB 페이지 크기는 압축을 향상시킬 있지만 버퍼 풀에 대한 수요를 증가시켜 I/O 쓰기 쓰기 증폭을 증가시킬 있습니다.

 

도움이 되셨다면 광고클릭 한번 부탁드립니다.※

 

'Databases > MySQL' 카테고리의 다른 글

[MySQL][InnoDB] Online DDL  (0) 2020.06.28
[MySQL][InnoDB] 행(Row)형식  (0) 2020.06.22
[MySQL][InnoDB] 테이블 압축  (0) 2020.06.13
[MySQL][InnoDB] 옵티마이저 통계 설정  (0) 2020.06.05
[MySQL][InnoDB] I/O설정  (0) 2020.06.02

Designed by JB FACTORY