Real MySQL 8.0 - 6장

minyeob·2024년 8월 27일
0

DB

목록 보기
3/6
post-thumbnail

6. 데이터 압축

데이터 파일이 클수록 쿼리를 처리하기 위해 더 많은 데이터페이지를 버퍼 풀로 읽어야하고,

백업 시간이 오래걸리며, 복구하는 데도 그만큼의 시간이 걸린다.

따라서 이런 문제점을 해결하기 위해 데이터 압축 기능을 제공한다.

페이지 압축

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 결정

압축된 결과가 어느 정도가 될지를 예측해서 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

profile
백엔드 개발자를 꿈꾸며 공부한 내용을 기록하고 있습니다.

0개의 댓글