Database

[MySQL] 데이터 압축

2023. 3. 24. 16:32
목차
  1. 페이지 압축
  2. 페이지 압축 작동 과정
  3. 테이블 압축
  4. 압축 테이블 생성
  5. 테이블 압축 작동 과정
  6. KEY_BLOCK_SIZE 튜닝
  7. Referrence

데이터가 압축되면 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

 

MySQL :: MySQL 8.0 Reference Manual :: 15.9.2 InnoDB Page Compression

15.9.2 InnoDB Page Compression InnoDB supports page-level compression for tables that reside in file-per-table tablespaces. This feature is referred to as Transparent Page Compression. Page compression is enabled by specifying the COMPRESSION attribute wi

dev.mysql.com

 

MySQL :: MySQL 8.0 Reference Manual :: 15.9.1 InnoDB Table Compression

MySQL 8.0 Reference Manual  /  ...  /  The InnoDB Storage Engine  /  InnoDB Table and Page Compression  /  InnoDB Table Compression PREV   HOME   UP   NEXT

dev.mysql.com

 

'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
  1. 페이지 압축
  2. 페이지 압축 작동 과정
  3. 테이블 압축
  4. 압축 테이블 생성
  5. 테이블 압축 작동 과정
  6. KEY_BLOCK_SIZE 튜닝
  7. Referrence
'Database' 카테고리의 다른 글
  • [MySQL] 인덱스 - 개요
  • [MySQL] 데이터 암호화
  • [MySQL] 잠금
  • [MySQL] 트랜잭션
acisliver
acisliver
acisliver
와당탕탕 개발놀이터
acisliver
전체
오늘
어제
  • 분류 전체보기 (65)
    • 회고 (11)
    • Spring (3)
    • 알고리즘 (21)
    • Java (2)
    • DevOps (2)
    • Shell (2)
    • Nginx (1)
    • Database (22)
    • Project (1)

블로그 메뉴

  • 태그
  • 방명록
  • GitHub
  • Notion

공지사항

인기 글

태그

  • 알고리즘
  • 우아한테크코스
  • 풀 테이블 스캔
  • innodb
  • 구름톤 트레이닝
  • dp
  • 인덱스
  • FuntionalInterface
  • mysql
  • 오픈소스 컨트리뷰톤
  • spring boot
  • 풀스택
  • 풀 인덱스 스캔
  • 프로그래머스
  • FOSSLight
  • Shell
  • DevOps
  • Java
  • 이분탐색
  • binarySearch
  • Leetcode
  • 이진탐색
  • 카카오
  • 코딩테스트
  • 자바
  • Bash
  • 오픈소스
  • Spring
  • 백준
  • 프리코스

최근 댓글

최근 글

hELLO · Designed By 정상우.
acisliver
[MySQL] 데이터 압축
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.