데이터 파일이 클수록 쿼리를 처리하기 위해 더 많은 데이터페이지를 버퍼 풀로 읽어야하고,
백업 시간이 오래걸리며, 복구하는 데도 그만큼의 시간이 걸린다.
따라서 이런 문제점을 해결하기 위해 데이터 압축 기능을 제공한다.
MySQL 서버가 디스크에 저장하는 시점에 데이터 페이지가 압축되어 저장되고, 반대로 MySQL. 서버가 디스크에서 데이터 페이지를 읽어올 때 압축이 해제된다.
문제점:
하나의 테이블은 동일한 크기의 페이지로 통일돼야 한다.
따라서 페이지 압축 기능은 운영체제별로 특정 버전의 파일 시스템에만 지원되는 펀치 홀 이라는 기능을 사용한다.
운영체제나 하드웨어에 대한 제약 없이 사용할 수 있기 때문에 일반적으로 더 활용도가 높은 편이다.
단점:
SET GLOBAL innodb_file_per_table=ON; //테이블 시스템 변수 설정
CREATE TABLE compressed_table(
c1 INT PRIMARY KEY
)
ROW_FORMAT=COMPRESSED //옵션 명시
KEY_BLOCK_SIZE=8; //페이지의 목표 크기를 명시
테이블 압축 방식에서 가장 중요한 것은 원본 데이터 페이지의 압축 결과가 목표 크기 보다 작거나 같을 때까지 반복해서 페이지를 스플릿한다.
압축된 결과가 어느 정도가 될지를 예측해서 KEY_BLOCK_SIZE 를 결정하는 것이 중요하다.
따라서 테이블 압축을 적용하기 전에 먼저 4KB 또는 8KB로 테이블을 생성해서 샘플 데이터를 저장해보고 적절한지 판단해야한다.
InnoDB 는 압축된 테이블의 데이터 페이지를 버퍼 풀에 적재하면 압축된 상태와 압축이 해제된 상태 2개 버전을 관리
따라서 버퍼 풀의 공간을 이중으로 사용하여 메모리를 낭비하게 됨
이 문제를 해결하기 위해 Unzip_LRU 리스트를 별도 관리
버퍼 풀 공간이 필요한 경우 압축된 데이터 페이지는 유지하고 Unzip_LRU 리스트에서 압축 해제된 버전은 제거하여 버퍼 풀 공간 확보
압축된 데이터 페이지가 자주 사용되는 경우에는 Unzip_LRU 리스트에 압축 해제된 페이지를 계속 유지하여 압축 및 압축 해제 작업 최소화
압축된 페이지가 사용되지 않을 경우 LRU 리스트에서 제거
innodb_cmp_per_index_enabled
innodb_compression_level
innodb_compression_failure_threshold_pct
innodb_compression_pad_pct_max
innodb_log_compressed_pages