[MySQL][InnoDB] 페이지 압축
- Databases/MySQL
- 2020. 6. 17.
■ 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 |