본문 바로가기
mysql

파티셔닝 Partitioning

by ┌(  ̄∇ ̄)┘™ 2018. 12. 17.
728x90

테이블에 데이터가 수백만 건 쌓이면 조회가 느려지고 관리가 버거워집니다. 파티셔닝(Partitioning)은 하나의 큰 테이블을 여러 개의 작은 조각(파티션)으로 논리 분할해, 조회 시 필요한 조각만 읽고 오래된 조각은 통째로 삭제할 수 있게 하는 기법입니다. 애플리케이션 입장에서는 여전히 하나의 테이블처럼 보입니다.

샤딩과의 차이: 파티셔닝은 한 서버 안에서 테이블을 나누는 것이고, 샤딩은 여러 서버로 나누는 것입니다. 파티셔닝은 관리·조회 효율을, 샤딩은 쓰기 확장을 노립니다.

파티셔닝의 종류

방식 기준
RANGE 값의 구간 (예: 연도 < 2013, < 2014 …)
LIST 지정된 값의 목록 (예: 지역 코드)
HASH 해시 함수로 균등 분배
KEY 기본키/유니크키 기반 해시

RANGE 파티셔닝 예제

가장 흔한 방식은 날짜(연도) 기준 RANGE 파티셔닝입니다. 생성 연도별로 데이터를 나눠 담습니다.

CREATE TABLE BusinessCard (
  id INT NOT NULL,
  name VARCHAR(255),
  address VARCHAR(255),
  telephone VARCHAR(255),
  createtime DATE
)
PARTITION BY RANGE (YEAR(createtime)) (
  PARTITION p0 VALUES LESS THAN (2013),
  PARTITION p1 VALUES LESS THAN (2014),
  PARTITION p2 VALUES LESS THAN (2015),
  PARTITION p3 VALUES LESS THAN MAXVALUE   -- 나머지 전부
);

SHOW CREATE TABLE BusinessCard\G
MAXVALUE는 "위 구간에 속하지 않는 나머지 전부"를 받는 마지막 파티션입니다. 이게 없으면 정의된 범위를 벗어나는 값을 넣을 때 오류가 납니다.

파티션 프루닝 — 성능 이점 확인

WHERE 조건이 파티션 키를 쓰면, DB는 관련된 파티션만 골라 읽습니다(Partition Pruning). EXPLAIN PARTITIONS로 실제로 어느 파티션만 스캔하는지 볼 수 있습니다.

INSERT INTO BusinessCard VALUES (1,'kim','seoul','123-456','2000-01-01');
INSERT INTO BusinessCard VALUES (2,'lee','seoul','123-456','2014-01-01');

EXPLAIN PARTITIONS
SELECT * FROM BusinessCard WHERE createtime >= '2014-01-01'\G
-- partitions 컬럼에 p2, p3 만 표시되면 프루닝 성공

파티션 관리 — 추가 / 삭제 / 분할 / 병합

추가·삭제

-- 파티션 추가
ALTER TABLE BusinessCard ADD PARTITION (
  PARTITION p4 VALUES LESS THAN (2005));

-- 파티션 삭제 (그 안의 데이터도 함께 즉시 삭제됨!)
ALTER TABLE BusinessCard DROP PARTITION p4;
오래된 데이터를 지울 때 DELETE는 느리지만, 해당 파티션을 DROP PARTITION하면 순식간에 통째로 삭제됩니다. 로그성 데이터 보관 정책(예: 3년치만 유지)에 특히 유용합니다.

분할(REORGANIZE)·병합

-- 한 파티션을 둘로 분할
ALTER TABLE BusinessCard REORGANIZE PARTITION p3 INTO (
  PARTITION p3 VALUES LESS THAN (2015),
  PARTITION p4 VALUES LESS THAN MAXVALUE
);

-- 여러 파티션을 하나로 병합
ALTER TABLE BusinessCard REORGANIZE PARTITION p2, p3 INTO (
  PARTITION p23 VALUES LESS THAN (2014)
);

정리

  • 파티셔닝은 한 서버 안에서 큰 테이블을 조각으로 나눠 조회·관리 효율을 높인다.
  • 종류는 RANGE·LIST·HASH·KEY이며, 날짜 기준 RANGE가 가장 흔하다.
  • WHERE에 파티션 키를 쓰면 필요한 파티션만 읽는 프루닝으로 조회가 빨라진다(EXPLAIN PARTITIONS로 확인).
  • 오래된 데이터는 DROP PARTITION으로 빠르게 정리할 수 있다.
728x90

댓글