DB

[MySQL] RANGE 파티션 전략: 날짜 기반 분할 실무 예제 📆

인생아 2025. 7. 8. 22:22
반응형

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

 

반응형