페이지 압축, 테이블 압축을 알아보자
Transparent Page Compression
이라고도 불림
MySQL 서버가 디스크에 저장
하는 시점에 데이터 페이지
가 압축
, MySQL 서버가 디스크에서 데이터 페이지를 읽어올 때
압축 해제
=> 버퍼 풀
에 데이터 페이지가 한 번 적재시 압축이 해제된 상태
로만 데이터 페이지 관리
데이터 페이지를 압축한 결과
가 적어도 하나의 테이블
은 동일
한 크기의 페이지
로 통일돼야 함
빈 데이터
를 기록)펀치 홀
생성운영체제
로 반납하드웨어
자체에서도 펀치 홀 기능
을 지원해야 사용 가능펀치 홀
을 지원하지 못함-- 테이블 생성 시
create table t1 (
c1 int
) compression="zlib";
-- 테이블 변경 시
alter table t1 compression="zlib";
optimize table t1;
단점
공간 활용률 낮음
성능 낮음
압축률 떨어짐
테이블 압축
사용을 위한 전제 조건
: 압축을 사용하려는 테이블
이 별도의 테이블 스페이스
를 사용해야 함
=> innodb_file_per_table
변수가 ON
set global innodb_file_per_table=on;
--row_format=compressed해야 테이블 압축
create table com_table(
c1 int primary key
) row_format=compressed --생략 후 key_block_size만 입력시 자동 생성
key_block_size=8; --KB 단위
Key_block_size 옵션
: 압축된 페이지
가 저장될 페이지 크기
지정
압축 완료
)스플릿
해서 2개의 페이지
에 8KB
씩 저장KEY_BLOCK_SIZE
를 4KB
또는 8KB
로 생성하고, 샘플 데이터
저장 후 판단하는 것이 좋음
-- 테이블 압축 사용 예제 테이블 생성
create table employees_comp4k(
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),
key ix_firstname (first_name),
key ix_hiredate (hire_date)
) row_format=compressed key_block_size=4;
--시스템 변수 변경
--인덱스 별 압축 실행 횟수와 성공 횟수 기록
set global innodb_cmp_per_index_enabled=on;
--employees 테이블 데이터를 그대로 압축 테스트 테이블로
insert into employees_comp4k select * from employees;
--압축 횟수와 성공 횟수, 실패율 조회
select table_name, index_name, compress_ops, compress_ops_ok,
(compress_ops-compress_ops_ok)/compress_ops * 100 as compression_failure_pct
from information_schema.INNODB_CMP_PER_INDEX;
압축 실패율
은 3~5% 미만
으로 나오게 하는 것이 좋음
InnoDB 엔진은 압축된 테이블
의 데이터 페이지
를 버퍼 풀
에 적재시 압축된 상태
와 압축 해제된 상태
2개 버전 관리
=> 압축된 테이블에 대해선 버퍼 풀
의 공간을 이중
으로 사용함으로써 메모리 낭비
=> 압축된 페이지에서 데이터를 읽거나 변경
하기 위해 압축 해제
를 해야 하는데, CPU 많이 소모
위 두가지 단점을 보완하기 위해 Unzip_LRU 리스트
를 별도로 관리하다가 MySQL 서버로 유입되는 요청 패턴
에 따라 적절히 아래와 같이 수행
버퍼 풀 공간
이 필요한 경우, LRU 리스트
에서 원본 데이터 페이지는 유지하고, Unzip_LRU 리스트
에서 압축 해제된 버전은 제거
압축된 데이터 페이지
가 자주 사용되는 경우 Unzip_LRU 리스트
에 압축 해제된 페이지를 계속 유지하며 압축 및 압축 해제 작업 최소화
LRU 리스트
에서 제거시, Unzip_LRU 리스트
에서도 함께 제거
innodb_cmp_per_index_enabled
: 테이블 압축이 사용된 테이블의 모든 인덱스별
로 압축 성공 및 압축 실행 횟수 수집innodb_compression_level
: 압축률
설정innodb_compression_failure_threshold_pct
와 innodb_compression_pad_pct_max
: 앞의 값보다 압축 실패율
이 커지면 압축
실행하기 전 원본 데이터 페이지 끝에 의도적으로 일정 크기의 빈 공간(패딩
)을 추가압축률
을 높여
서 압축 결과가 key_block_size
보다 작아지게 만듦계속 증가된 크기
를 가지며 최대 크기는 뒤의 시스템 변수 값을 넘지 못함innodb_log_compressed_pages
: MySQL 서버가 비정상적으로 종료됐다가 다시 시작되는 경우, 압축 알고리즘
의 버전 차이가 있더라도 복구 실패하지 않도록 압축된 데이터 페이지
를 그대로 리두 로그
에 기록