책너두 6기 18일차

백은빈, 이성욱의 Real MySQL8.0 1권 p.185 ~ p.194

내용정리

06 데이터 압축

  • 디스크에 저장된 데이터 파일의 크기는 쿼리의 처리 성능, 백업 및 복구 시간과도 연결된다.
  • 시간과 비용을 절약하기 위해 데이터 압축 기능이 있다.

6.1 페이지 압축

  • “Transparent Page Compression”이라고도 불린다.
  • 서버가 디스크에 저장하는 시점에 데이터 페이지가 압축되어 저장
  • 서버가 디스크에서 데이터 페이지를 잃어올 때 압축이 해제
  • 페이지 압축 작동 방식
    • 16KB 페이지를 압축(압축 결과를 7KB로 가정)
    • MySQL 서버는 디스크에 압축된 결과 7KB를 기록(이때 MySQL 서버는 압축 데이터 7KB에 9KB의 빈 데이터를 기록)
    • 디스크에 데이터를 기록한 후, 7KB 이후의 공간 9KB에 대해 펀치 홀(Punch-hole)을 생성
    • 파일 시스템은 7KB만 남기고 나머지 디스크의 9KB 공간은 다시 운영체제로 반납
  • 여러 이유로 페이지 압축은 거의 사용되지 않는다.

6.2 테이블 압축

  • 디스크의 데이터 파일 크기를 줄일 수 있다.
  • 단점도 있다.
    • 버퍼 풀 공간 활용률이 낮음
    • 쿼리 처리 성능이 낮음
    • 빈번한 데이터 변경시 압축률이 떨어짐

6.2.1 압축 테이블 생성

  • 압축을 사용하려는 테이블이 별도의 테이블 스페이스를 사용해야 한다.
  • innodb_file_per_table 시스템 변수가 ON이어야 함.
  • 압축된 페이지의 목표크기는 2n(n은 2 이상)으로만 설정할 수 있다.
set global innodb_file_per_table=ON;

// row_format 옵션과 key_block_size 옵션을 모두 명시
create table compressed_table (
	c1 int primary key
	)
	row_format=compressed
	key_block_size=8;

// key_block_size 옵션만 명시
create table compressed_table (
    c1 int primary key
    )
    key_block_size=8;

6.2.2 KEY_BLOCK_SIZE 결정

  • 테이블 압축에서 가장 중요한 부분은 압축된 결과가 어느 정도가 될지를 예측해서 KEY_BLOCK_SIZE를 결정하는 것
  • 압축실패율이 3~5% 미만을 유지할 수 있게 선택하자.
  • 압축 실패율이 높다고 해서 압축을 사용하지 말아야 한다는 것은 아니다.

6.2.3 압축된 페이지의 버퍼 풀 적재 및 사용

InnoDB 스토리지 엔진은 압축된 테이블의 데이터 페이지를 버퍼 풀에 적재하면 압축 된 상태, 안된 상태 2개 버전을 관리한다.

6.2.4 테이블 압축 관련 설정

  • 다음은 페이지의 압축 실패율을 낮추기 위해 필요한 튜닝 포인트를 제공한다.
  • innodb_cmp_per_index_enabled: 테이블 압축이 사용된 테이블의 모든 인덱스별로 압축 성공 및 압축 실행 횟수를 수집
  • innodb_compression_level : 압축률 설정
  • innodb_compression_failure_threshold_pct, innodb_compression_pad_pct_max : 압축 실패율이 전자 값보다 커지면 패딩(Padding)이라는 빈 공간을 원본 데이터 페이지의 끝에 의도적으로 추가한다. 후자는 최대 패딩 값
  • innodb_log_compressed_pages : 서버가 비정상적으로 종료된 후 재시작될 때 압축된 데이터 페이지를 리두 로그에 기록하는 것

읽고 나서

앞으로 대규모 트래픽을 관리하려면 꼭 알아두는게 좋겠다.