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
'mysql' 카테고리의 다른 글
| 샤딩 sharding (0) | 2018.12.19 |
|---|---|
| 트랜잭션 Transcation, 락 Lock, 격리수준 IsolationLevel (0) | 2018.12.18 |
| Azure Linux VM에서 MySQL 성능 최적화 (0) | 2016.06.16 |
| 보안 강도에 따른 해쉬함수 분류 ( sha2 512 in mysql, php ) (0) | 2013.10.28 |
| group_concat 중복제거하기 (0) | 2013.10.11 |
댓글