MySQL에서 대용량 로그 테이블이나 이력 데이터 테이블을 관리할 때 가장 널리 쓰이는 파티셔닝 방식이 RANGE 파티션이다.
RANGE 파티션은 특정 컬럼의 범위에 따라 데이터를 분할하는 전략으로, 특히 날짜 컬럼을 기준으로 나누는 데 최적화된 구조다.

✅ RANGE 파티션이란?
RANGE 파티션은 지정된 컬럼 값이 특정 범위에 포함되는지에 따라 파티션을 분할한다.
가장 대표적인 예가 log_date 같은 날짜 컬럼이다.
예를 들어, 2024-01-01부터 2024-01-31까지의 데이터를 하나의 파티션으로, 그 이후는 또 다른 파티션으로 나눌 수 있다.
PARTITION BY RANGE (YEAR(log_date)) (
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025)
)
이렇게 설정하면 log_date가 2022년이면 p2022, 2023년이면 p2023에 저장된다.
📋 실무 예제: 월별 로그 테이블 분할
로그 테이블이 매일 수십만 건씩 쌓이는 구조라면 월별 파티션이 효과적이다.
아래는 log_table을 월 단위로 분할하는 예제다.
CREATE TABLE log_table (
id BIGINT NOT NULL,
log_date DATE NOT NULL,
message TEXT,
PRIMARY KEY (id, log_date)
)
PARTITION BY RANGE (TO_DAYS(log_date)) (
PARTITION p202401 VALUES LESS THAN (TO_DAYS('2024-02-01')),
PARTITION p202402 VALUES LESS THAN (TO_DAYS('2024-03-01')),
PARTITION p202403 VALUES LESS THAN (TO_DAYS('2024-04-01')),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
이 테이블은 다음과 같은 특징을 가진다.
- TO_DAYS()를 사용하여 일 단위로 파티션 나누기
- log_date가 2024년 1월이면 p202401에, 2월이면 p202402에 들어감
- 향후 월별 데이터 삭제 시 ALTER TABLE ... DROP PARTITION으로 빠르게 제거 가능
🔍 파티션 프루닝(Partition Pruning) 효과
다음 쿼리를 보자.
SELECT * FROM log_table
WHERE log_date BETWEEN '2024-01-10' AND '2024-01-20';
이 쿼리는 MySQL이 자동으로 p202401 파티션만 스캔하게 최적화된다.
전체 1억 건 중 p202401에 있는 300만 건만 탐색하게 되므로, 쿼리 속도는 수십 배 이상 빨라질 수 있다.
이처럼 RANGE 파티션은 I/O를 최소화하고 쿼리 성능을 극대화하는데 탁월한 효과를 발휘한다.
⚠️ 파티션 키 조건
RANGE 파티션을 사용하기 위해서는 다음 조건을 충족해야 한다.
- PRIMARY KEY 또는 UNIQUE KEY는 반드시 파티션 키를 포함해야 함
- 파티션 키로는 일반적인 컬럼 또는 함수 결과값을 사용할 수 있음 (YEAR(), TO_DAYS(), UNIX_TIMESTAMP() 등)
- WHERE 절의 조건이 파티션 키와 관련 없으면 프루닝이 불가능해 성능 저하
즉, 파티션 키와 관련된 컬럼을 중심으로 WHERE 조건을 작성해야 한다.
🧠 실무 설계 팁
- 월별 데이터가 일정하다면 TO_DAYS()로 분할하자
- log_date 대신 created_at 같은 DATETIME도 가능하지만, 함수는 통일해서 쓰는 게 좋다
- 과거 데이터를 주기적으로 삭제해야 한다면 DROP PARTITION을 활용해 수초 만에 데이터 삭제 가능
- 모든 월에 대해 미리 파티션을 생성해두면 INSERT 시점에서 파티션 미존재 오류를 방지할 수 있다
🧪 DROP PARTITION으로 빠르게 데이터 삭제
RANGE 파티션은 유지보수 관점에서도 강력하다.
예를 들어, 2024년 1월 데이터를 삭제하고 싶다면 다음과 같이 처리하면 된다.
ALTER TABLE log_table DROP PARTITION p202401;
수천만 건 데이터를 지우는 작업을 단 0.1초 내외로 처리할 수 있으며, 트랜잭션 롤백도 필요 없다.
이러한 유지보수 효율성은 일반 테이블에서는 얻을 수 없는 큰 장점이다.
✅ 정리
- RANGE 파티션은 날짜 기반 분할에 가장 적합한 파티셔닝 전략이다.
- TO_DAYS(), YEAR() 등 날짜 함수와 함께 쓰면 월별, 연도별 분할이 가능하다.
- 파티션 프루닝을 통해 조회 성능이 비약적으로 향상된다.
- DROP PARTITION으로 빠른 데이터 삭제가 가능해 운영 관리도 편리하다.
🔗 공식 문서 참고
MySQL 8.0 Reference Manual - RANGE Partitioning
'DB' 카테고리의 다른 글
| [MySQL] 파티션 설계 시 주의할 점과 실무 적용 팁 🚨 (2) | 2025.07.09 |
|---|---|
| [MySQL] KEY 파티션 전략: 자동 해시로 분산 처리하기 🔑 (1) | 2025.07.09 |
| [MySQL] HASH 파티션 전략: 균등 분산의 핵심 알고리즘 ⚙️ (1) | 2025.07.08 |
| [MySQL] LIST 파티션 전략: 특정 값 기준 분할 방법 (0) | 2025.07.08 |
| [MySQL] 파티셔닝(Partitioning) 개념과 사용 목적 총정리 📦 (0) | 2025.07.08 |
| [MySQL] 쿼리 리팩토링 전/후 실행계획으로 성능 변화 분석하기 🔍 (0) | 2025.07.08 |
| [MySQL] 복잡한 쿼리 리팩토링: 서브쿼리 → JOIN → CTE 변환 사례 분석 (0) | 2025.07.08 |
| [MySQL] CTE vs 서브쿼리 성능 비교 및 튜닝 포인트 🧠 (0) | 2025.07.08 |