Loading...
MySQL 9.5 Reference Manual 9.5의 17.9.2 InnoDB Page Compression의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
InnoDB는
file-per-table
테이블스페이스에 위치한 테이블에 대해 페이지 단위의 압축을 지원합니다. 이 기능은 Transparent
_Page Compression_이라고도 합니다. 페이지 압축은
CREATE TABLE 또는
ALTER TABLE에서 COMPRESSION 속성을 지정하여 활성화합니다. 지원되는 압축
알고리즘에는 Zlib과
LZ4가 포함됩니다.
페이지 압축에는 스파스 파일 및 홀 펀칭 지원이 필요합니다. 페이지 압축은 NTFS를 사용하는 Windows와, 커널 레벨에서 홀 펀칭을 지원하는 다음 MySQL 지원 Linux 플랫폼의 부분 집합에서 지원됩니다:
kernel version 3.10.0-123 이상을 사용하는 RHEL 7 및 파생 배포판
OEL 5.10 (UEK2) kernel version 2.6.39 이상
OEL 6.5 (UEK3) kernel version 3.8.13 이상
OEL 7.0 kernel version 3.8.13 이상
SLE11 kernel version 3.0-x
SLE12 kernel version 3.12-x
OES11 kernel version 3.0-x
Ubuntu 14.0.4 LTS kernel version 3.13 이상
Ubuntu 12.0.4 LTS kernel version 3.2 이상
Debian 7 kernel version 3.2 이상
참고
특정 Linux 배포판에서 사용 가능한 모든 파일 시스템이 홀 펀칭을 지원하는 것은 아닐 수 있습니다.
페이지가 기록될 때, 지정된 압축 알고리즘을 사용하여 압축됩니다. 압축된 데이터는 디스크에 기록되며, 홀 펀칭 메커니즘이 페이지 끝에서 비어 있는 블록을 해제합니다. 압축에 실패하면 데이터는 그대로 기록됩니다.
Linux 시스템에서 파일 시스템 블록 크기는
홀 펀칭에 사용되는 단위 크기입니다. 따라서 페이지 압축은 페이지
데이터가 InnoDB 페이지 크기에서 파일 시스템 블록
크기를 뺀 값보다 작거나 같은 크기로 압축될 수 있는 경우에만 동작합니다. 예를 들어,
innodb_page_size=16K이고 파일
시스템 블록 크기가 4K인 경우, 페이지 데이터는 홀 펀칭이 가능하도록
12K보다 작거나 같은 크기로 압축되어야 합니다.
Windows 시스템에서 스파스 파일을 위한 기반 인프라는 NTFS 압축을 기반으로 합니다. 홀 펀칭 크기는 NTFS 클러스터 크기의 16배인 NTFS compression unit입니다. 클러스터 크기와 해당 compression unit은 다음 표와 같습니다:
Table 17.11 Windows NTFS Cluster Size and Compression Units
| Cluster Size | Compression Unit |
|---|---|
| 512 Bytes | 8 KB |
| 1 KB | 16 KB |
| 2 KB | 32 KB |
| 4 KB | 64 KB |
Windows 시스템에서 페이지 압축은 페이지 데이터가
InnoDB 페이지 크기에서 compression unit
크기를 뺀 값보다 작거나 같은 크기로 압축될 수 있는 경우에만 동작합니다.
기본 NTFS 클러스터 크기는 4KB이며, 이때 compression
unit 크기는 64KB입니다. 이는 최대
innodb_page_size 역시 64KB이므로,
기본 설정(out-of-the box)의 Windows NTFS 구성에서는 페이지 압축의 이점이 없음을 의미합니다.
Windows에서 페이지 압축이 동작하려면, 파일 시스템이
4K보다 작은 클러스터 크기로 생성되어야 하며,
innodb_page_size는 compression unit의 최소 두 배 이상이어야 합니다. 예를 들어,
Windows에서 페이지 압축이 동작하도록 하려면, 클러스터 크기가 512 Bytes(해당 compression
unit은 8KB)인 파일 시스템을 생성하고
InnoDB를
innodb_page_size 값을 16K 이상으로 초기화할 수 있습니다.
페이지 압축을 활성화하려면,
CREATE TABLE 문에서
COMPRESSION 속성을 지정합니다. 예를 들어:
1CREATE TABLE t1 (c1 INT) COMPRESSION="zlib";
ALTER TABLE 문에서도 페이지 압축을 활성화할 수 있습니다. 그러나
ALTER TABLE ... COMPRESSION은 테이블스페이스 압축
속성만 업데이트합니다. 새 압축 알고리즘을 설정한 이후에 발생하는 테이블스페이스에 대한 쓰기는 새로운 설정을 사용하지만,
기존 페이지에 새 압축 알고리즘을 적용하려면
OPTIMIZE TABLE을 사용하여 테이블을 재구축해야 합니다.
1ALTER TABLE t1 COMPRESSION="zlib"; 2OPTIMIZE TABLE t1;
페이지 압축을 비활성화하려면,
ALTER TABLE을 사용하여
COMPRESSION=None을 설정합니다.
COMPRESSION=None이 설정된 이후에 발생하는 테이블스페이스에 대한 쓰기는 더 이상 페이지
압축을 사용하지 않습니다. 기존 페이지의 압축을 해제하려면,
COMPRESSION=None을 설정한 후
OPTIMIZE TABLE을 사용하여 테이블을 재구축해야 합니다.
1ALTER TABLE t1 COMPRESSION="None"; 2OPTIMIZE TABLE t1;
페이지 압축 메타데이터는 Information Schema의
INNODB_TABLESPACES 테이블에서 다음 컬럼에서 찾을 수 있습니다:
FS_BLOCK_SIZE: 홀 펀칭에 사용되는 단위 크기인
파일 시스템 블록 크기입니다.
FILE_SIZE: 압축되지 않은 파일의 최대 크기를 나타내는
겉보기(apparent) 파일 크기입니다.
ALLOCATED_SIZE: 디스크에 할당된 공간의 양을 나타내는
실제 파일 크기입니다.
참고
Unix 계열 시스템에서는 ls -l tablespace_name.ibd가
겉보기 파일 크기(FILE_SIZE에 해당)를 바이트 단위로 보여줍니다.
디스크에 할당된 실제 공간(ALLOCATED_SIZE에 해당)을 보려면
du --block-size=1 tablespace_name.ibd를 사용합니다.
--block-size=1 옵션은 할당된 공간을 블록이 아닌 바이트 단위로 출력하므로,
ls -l 출력과 비교할 수 있습니다.
SHOW CREATE TABLE을 사용하여
현재 페이지 압축 설정(Zlib,
Lz4, 또는 None)을 확인할 수 있습니다. 하나의 테이블은 서로 다른 압축 설정을 가진 페이지의 혼합을 포함할 수 있습니다.
다음 예에서는 employees 테이블에 대한 페이지 압축 메타데이터를
Information Schema
INNODB_TABLESPACES 테이블에서 조회합니다.
1# Create the employees table with Zlib page compression 2 3CREATE TABLE employees ( 4 emp_no INT NOT NULL, 5 birth_date DATE NOT NULL, 6 first_name VARCHAR(14) NOT NULL, 7 last_name VARCHAR(16) NOT NULL, 8 gender ENUM ('M','F') NOT NULL, 9 hire_date DATE NOT NULL, 10 PRIMARY KEY (emp_no) 11) COMPRESSION="zlib"; 12 13# Insert data (not shown) 14 15# Query page compression metadata in INFORMATION_SCHEMA.INNODB_TABLESPACES 16 17mysql> SELECT SPACE, NAME, FS_BLOCK_SIZE, FILE_SIZE, ALLOCATED_SIZE FROM 18 INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='employees/employees'\G 19*************************** 1. row *************************** 20SPACE: 45 21NAME: employees/employees 22FS_BLOCK_SIZE: 4096 23FILE_SIZE: 23068672 24ALLOCATED_SIZE: 19415040
Employees 테이블에 대한 페이지 압축 메타데이터는 겉보기 파일 크기가 23068672 바이트인 반면, 실제 파일 크기 (페이지 압축 적용 후)는 19415040 바이트임을 보여줍니다. 파일 시스템 블록 크기는 4096 바이트이며, 이는 홀 펀칭에 사용되는 블록 크기입니다.
페이지 압축이 활성화된 테이블을 식별하려면,
COMPRESSION 속성으로 정의된 테이블에 대해
Information Schema TABLES
테이블의 CREATE_OPTIONS 컬럼을 확인할 수 있습니다:
1mysql> SELECT TABLE_NAME, TABLE_SCHEMA, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES 2 WHERE CREATE_OPTIONS LIKE '%COMPRESSION=%'; 3+------------+--------------+--------------------+ 4| TABLE_NAME | TABLE_SCHEMA | CREATE_OPTIONS | 5+------------+--------------+--------------------+ 6| employees | test | COMPRESSION="zlib" | 7+------------+--------------+--------------------+
SHOW CREATE TABLE 역시 사용된 경우
COMPRESSION 속성을 보여줍니다.
파일 시스템 블록 크기(또는 Windows의 compression unit size) * 2 >
innodb_page_size인 경우 페이지 압축은 비활성화됩니다.
페이지 압축은 공유 테이블스페이스(시스템 테이블스페이스, 임시 테이블스페이스, 일반 테이블스페이스)에 위치한 테이블에 대해 지원되지 않습니다.
페이지 압축은 undo log 테이블스페이스에 대해 지원되지 않습니다.
페이지 압축은 redo log 페이지에 대해 지원되지 않습니다.
공간 인덱스에 사용되는 R-tree 페이지는 압축되지 않습니다.
압축된 테이블(ROW_FORMAT=COMPRESSED)에 속한 페이지는 그대로 유지됩니다.
복구 중에는, 갱신된 페이지가 압축되지 않은 형식으로 기록됩니다.
사용된 압축 알고리즘을 지원하지 않는 서버에 페이지 압축된 테이블스페이스를 로딩하면 I/O 에러가 발생합니다.
페이지 압축을 지원하지 않는 이전 버전의 MySQL로 다운그레이드하기 전에,
페이지 압축 기능을 사용하는 테이블의 압축을 해제해야 합니다. 테이블의 압축을 해제하려면
ALTER TABLE ... COMPRESSION=None 및 OPTIMIZE TABLE을 실행합니다.
사용된 압축 알고리즘이 양쪽 서버에 모두 존재한다면, 페이지 압축된 테이블스페이스는 Linux와 Windows 서버 간에 복사할 수 있습니다.
페이지 압축된 테이블스페이스 파일을 한 호스트에서 다른 호스트로 이동할 때 페이지 압축을 보존하려면, 스파스 파일을 보존하는 유틸리티가 필요합니다.
NVMFS는 punch hole 기능을 활용하도록 설계되어 있으므로, NVMFS가 있는 Fusion-io 하드웨어에서는 다른 플랫폼보다 더 나은 페이지 압축을 달성할 수 있습니다.
큰 InnoDB 페이지 크기와 상대적으로 작은 파일
시스템 블록 크기를 함께 사용하여 페이지 압축 기능을 사용하면 쓰기 증폭이 발생할 수 있습니다. 예를 들어,
최대 InnoDB 페이지 크기가 64KB이고 파일 시스템 블록 크기가 4KB인 경우,
압축은 향상될 수 있지만 버퍼 풀에 대한 수요가 증가하여
I/O 증가 및 잠재적인 쓰기 증폭으로 이어질 수 있습니다.
17.9.1 InnoDB Table Compression
17.10 InnoDB Row Formats