데이터가 압축되면 InnoDB 버퍼풀로 읽어야 할 데이터 페이지가 줄어들고 백업 및 복구 시간도 단축된다.
페이지 압축
file-per-table 테이블 스페이스에 저장된 테이블에 제공하는 데이터 페이지 단위 압축이다. MySQL 서버가 디스크에 저장하는 시점에 데이터 페이지를 압축한다. 반대로 디스크에서 데이터 페이지를 읽는 시점에 데이터 페이지를 압축 해제한다.
InnoDB와 Disk 간 I/O 시점에 데이터 페이지를 압축, 압축 해제를 한다. 즉, 버퍼 풀의 데이터 페이지는 압축 해제된 상태이다. 그래서 MySQL 서버의 내부 코드는 압축 여부와 관계없이 투명(Transparent)하게 동작한다. 그래서 페이지 압축은 Transparent Page Compression이라고도 불린다.
한 테이블은 동일한 데이터 페이지로 구성되어야 한다(배열처럼). 하지만 데이터 페이지 압축 결과를 예측할 수 없다는 문제가 있다. 이를 해결하기 위해 OS 파일 시스템에서 지원하는 펀치 홀 기능을 사용한다.
페이지 압축 작동 과정
1. 페이지 압축
2. 압축된 페이지와 빈 데이터 기록
3. 펀치홀 생성 및 반환
예를 들면
1. 16KB 페이지 압축 ➡ 7KB
2. 압축된 페이지(7KB)와 빈 데이터(9KB) 디스크에 기록
3. 빈 공간에 대해 펀치홀 생성
4. 펀치홀을 OS에 반환
펀치홀 기능은 OS와 H/W 모두 지원을 해야 사용할 수 있는 기능이다. 또 다른 문제점은 아직 파일 시스템 관련 명령어가 펀치 홀을 지원하지 못한다는 것이다. 그러한 이유에서 페이지 압축은 잘 사용되지 않는다.
압축 적용
CREATE TABLE 또는 ALTER TABLE 명령어로 압축을 사용할 수 있다.
mysql> CREATE TABLE t1 (c1 INT) COMPRESSION="zlib";
ALTER TABLE 명령어는 오직 압축 알고리즘 속성만 변경한다. 따라서 기존 데이터에 새로운 압축 알고리즘을 적용하고 싶다면 OPTIMIZE TABLE 명령어를 사용해 테이블을 재구축해야 한다.
mysql> ALTER TABLE t1 COMPRESSION="zlib";
mysql> OPTIMIZE TABLE t1;
테이블 압축
file-per-table, general 테이블 스페이스에 저장된 테이블에 제공하는 테이블 단위 압축이다. OS나 H/W 제약 없이 사용할 수 있다.
압축 테이블 생성
file-pert-table 테이블 스페이스에서 압축 테이블을 생성하기 위해서 우선 innodb_file_per_table 시스템 변수를 ON 한다.
mysql> SET GLOBAL innodb_file_per_table=1;
CREATE TABLE 또는 ALTER TABLE 명령어와 ROW_FORMAT=COMPRESSED, KEY_BLOCK_SIZE 속성으로 압축을 사용할 수 있다.
mysql> CREATE TABLE t1(
c1 INT PRIMARY KEY
)
ROW_FORMAT=COMPRESSED
KEY_BLOCK_SIZE=8;
ROW_FORMAT=COMPRESSED 옵션은 생략 가능하다.
KEY_BLOCK_SIZE 옵션에 압축된 페이지의 목표 크기를 명시해야 한다. 목표 크기는 2 이상인 2의 배수로만 설정할 수 있다.
general 테이블 스페이스의 경우 조금 복잡해서 생략하겠다.
링크에서 Creating a Compressed Table in a General Tablespace를 참고하면 자세히 나와있다.
테이블 압축 작동 과정
압축을 적용할 때 KEY_BLOCK_SIZE 옵션에 압축된 페이지가 저장될 페이지의 크기를 지정한다. 페이지 압축에서 압축된 데이터 페이지의 크기를 알 수 없다는 문제를 알았다. 그렇다면 어떻게 압축된 페이지 크기를 지정할까? 방법은 지정한 페이지가 될 때까지 데이터 페이지를 스플릿하는 것이다.
압축 작동 과정을 살펴보면
1. 데이터 페이지 압축
1.1 압축된 페이지의 크기가 목표 크기 이하이면 디스크에 저장(압축 완료)
1.2 압축된 페이지의 크기가 목표 크기를 초과하면 원본 페이지를 스플릿해서 절반씩 저장
2. 스플릿된 페이지 각각에서 1단계 반복 실행
테이블 압축 방식은 원본 데이터 페이지의 압축 결과가 목표 크기 이하일 때까지 스플릿하기 때문에 서버 처리 성능을 저하시킬 수 있다.
KEY_BLOCK_SIZE 튜닝
테이블 압축에서 가장 중요한 것은 압축된 결과를 예측해 KEY_BLOCK_SIZE를 적절히 정하는 것이다.
Referrence
'Database' 카테고리의 다른 글
[MySQL] 인덱스 - 개요 (0) | 2023.04.21 |
---|---|
[MySQL] 데이터 암호화 (0) | 2023.03.29 |
[MySQL] 잠금 (0) | 2023.03.15 |
[MySQL] 트랜잭션 (0) | 2023.03.08 |
[MySQL] InnoDB 스토리지 엔진 아키텍처 - 4 (0) | 2023.03.01 |