MySQL에서 테이블의 데이터 양이 많아지면 자연스럽게 성능 이슈가 발생한다.
이때 사용할 수 있는 대표적인 기능이 바로 파티셔닝(Partitioning)이다.
파티셔닝은 데이터를 논리적으로 분할하여 관리하는 기능으로, 데이터 양이 많을수록 성능 개선 효과가 크다.

📌 파티셔닝이란?
파티셔닝(Partitioning)은 하나의 테이블 데이터를 여러 개의 파티션(분할된 영역)으로 나누는 것이다.
사용자는 하나의 테이블처럼 SELECT, INSERT, UPDATE, DELETE를 수행하지만 내부적으로는 MySQL이 자동으로 여러 파티션에 나눠서 처리한다.
다시 말해, 단일 테이블 구조를 유지하면서도 성능은 다중 테이블처럼 분산 처리할 수 있는 기술이다.
✅ 왜 파티셔닝을 사용하는가?
파티셔닝의 주요 목적은 다음과 같다.
- 대용량 데이터 처리 시 성능 향상
- 쿼리 범위 제한을 통한 I/O 감소
- 아카이브, 백업, 삭제 등 유지보수 편의성
- 병렬 처리 가능성 확보
- 테이블 잠금 시간 최소화
예를 들어, 로그 테이블에 1억 건 이상 쌓였을 때, 날짜 기준으로 분할된 파티션을 사용하면
WHERE log_date BETWEEN '2024-01-01' AND '2024-01-31'과 같은 쿼리가 해당 월 파티션에만 접근하게 되어 훨씬 빠르게 동작한다.
📁 파티셔닝이 동작하는 방식
MySQL은 파티셔닝된 테이블을 조회할 때, 쿼리 조건에 따라 해당 파티션만 스캔하는 방식으로 최적화한다.
이걸 Partition Pruning이라고 하며, 실행계획(EXPLAIN)을 보면 실제 접근된 파티션만 표시된다.
예를 들어 아래와 같은 쿼리를 실행하면,
SELECT * FROM log_table
WHERE log_date BETWEEN '2024-06-01' AND '2024-06-30';
만약 log_date 컬럼을 기준으로 RANGE 파티션이 되어 있다면, 6월 파티션만 스캔한다.
반면 파티셔닝이 없었다면 1억 건을 모두 조회한 뒤 필터링해야 하므로 성능이 급격히 저하된다.
🧠 파티셔닝 vs 샤딩 차이점
| 항목 | 파티셔닝 | 샤딩 |
| 단위 | 테이블 내부 분할 | 데이터베이스 자체를 분산 |
| 관리 주체 | MySQL 내부 엔진 자동 처리 | 직접 샤드 서버 구성 필요 |
| 사용 대상 | 테이블 레벨 | 대규모 분산 시스템 전용 |
| 복잡도 | 낮음 | 높음 |
파티셔닝은 로컬 단일 서버 내에서 사용되는 기술이며, 샤딩은 대규모 트래픽 분산 처리 시스템에서 사용된다.
즉, 파티셔닝은 운영 단위에서 바로 도입 가능한 범위 내 확장 기술이다.
🧩 파티셔닝의 전제 조건과 한계
- 기본 키(PRIMARY KEY)는 파티션 키를 반드시 포함해야 함
- 외래 키(FK)를 사용할 수 없음
- FULLTEXT, SPATIAL 인덱스는 지원 안 됨
- ALTER TABLE이 제한적이며 파티션 추가/삭제도 주의가 필요
즉, 무분별하게 사용하기보다는 정확한 파티셔닝 전략을 먼저 세운 후 도입하는 것이 안전하다.
🧪 어떤 상황에서 도입하는가?
- 로그, 주문, 이벤트, 트래픽 이력 등 시계열 대용량 테이블
- 업무상 특정 컬럼 기준으로 범위 조회가 빈번한 경우
- 테이블이 너무 커서 주기적 데이터 삭제가 어려운 경우
이런 테이블들은 RANGE 또는 LIST 파티션을 통해 실무에서 적극 활용되고 있다.
🚀 다음 단계는?
파티셔닝 전략은 크게 네 가지로 나뉜다.
- RANGE 파티션: 날짜, 수치 범위 기반
- LIST 파티션: 특정 값 리스트 기반
- HASH 파티션: 해시 함수 기반 균등 분산
- KEY 파티션: 내부 해시 기반 자동 분산
이 전략들을 각각 이해하고 실무에서 어떻게 적용할 수 있을지를 다음 글에서 하나씩 살펴볼 예정이다.
🔗 공식 문서 참고
MySQL 8.0 Reference Manual - Partitioning Overview
'DB' 카테고리의 다른 글
| [MySQL] KEY 파티션 전략: 자동 해시로 분산 처리하기 🔑 (1) | 2025.07.09 |
|---|---|
| [MySQL] HASH 파티션 전략: 균등 분산의 핵심 알고리즘 ⚙️ (1) | 2025.07.08 |
| [MySQL] LIST 파티션 전략: 특정 값 기준 분할 방법 (0) | 2025.07.08 |
| [MySQL] RANGE 파티션 전략: 날짜 기반 분할 실무 예제 📆 (2) | 2025.07.08 |
| [MySQL] 쿼리 리팩토링 전/후 실행계획으로 성능 변화 분석하기 🔍 (0) | 2025.07.08 |
| [MySQL] 복잡한 쿼리 리팩토링: 서브쿼리 → JOIN → CTE 변환 사례 분석 (0) | 2025.07.08 |
| [MySQL] CTE vs 서브쿼리 성능 비교 및 튜닝 포인트 🧠 (0) | 2025.07.08 |
| [MySQL] 서브쿼리 vs JOIN 실전 성능 비교 예제 (0) | 2025.07.08 |