MySQL에서 파티셔닝 전략 중 하나인 KEY 파티션은 HASH 파티션과 매우 유사하지만, 한 가지 큰 차이가 있다.
바로 사용자가 직접 해시 함수를 지정하지 않아도 된다는 점이다.
MySQL이 내부적으로 자동 해시 알고리즘을 사용해 데이터를 분산 처리하기 때문에 사용자가 훨씬 쉽게 사용할 수 있다.

✅ KEY 파티션이란?
KEY 파티션은 지정한 컬럼의 값을 MySQL 내부 해시 함수로 변환해 파티션에 분산 저장하는 방식이다.
HASH 파티션은 사용자가 해시 기준 함수를 직접 지정해야 하지만, KEY는 자동으로 처리된다.
PARTITION BY KEY(user_id) PARTITIONS 4
이처럼 사용자는 단순히 컬럼 이름과 파티션 수만 지정하면 된다.
MySQL은 user_id 값을 내부 해시 처리하여 0~3 중 하나의 파티션에 자동으로 할당한다.
🧪 실전 예제: 주문 테이블에 KEY 파티션 적용
CREATE TABLE orders (
id BIGINT NOT NULL,
user_id INT NOT NULL,
order_date DATETIME,
status VARCHAR(20),
PRIMARY KEY (id, user_id)
)
PARTITION BY KEY(user_id)
PARTITIONS 4;
이 설정을 통해 다음과 같은 동작이 이루어진다.
- user_id 값을 MySQL 내부 해시 알고리즘으로 처리
- 4개의 파티션 중 하나에 자동으로 분배
- 파티션 이름은 orders#P#p0, p1, p2, p3 형식으로 부여됨
- 사용자는 쿼리를 평소처럼 쓰면 되고, 파티션 정보는 MySQL이 자동으로 판단
📦 KEY vs HASH 차이
| 항목 | HASH 파티션 | KEY 파티션 |
| 해시 함수 | 사용자 지정 필요 | MySQL 내부 해시 자동 사용 |
| 설정 난이도 | 상대적으로 높음 | 매우 간단함 |
| 성능 차이 | 거의 동일 | 거의 동일 |
| 분산 기준 제어 | 가능 | 불가능 |
즉, 단순하게 균등 분산이 필요하고, 해시 알고리즘을 직접 설정할 필요가 없다면 KEY 파티션이 더 적합하다.
🔍 쿼리 예제와 파티션 접근 방식
SELECT * FROM orders WHERE user_id = 3456;
위 쿼리를 실행하면 MySQL은 내부적으로 user_id = 3456을 해시 처리한 결과를 기반으로
정확한 파티션 하나만 조회하게 된다. 즉, I/O가 전체 파티션으로 분산되지 않고 한 곳만 조회되므로 성능 향상이 가능하다.
반면 다음과 같은 쿼리는 파티션 효과가 거의 사라진다.
SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31';
이 쿼리는 해시 기준인 user_id와 관련이 없기 때문에 모든 파티션을 순회하게 된다.
🧠 실무에서 KEY 파티션을 쓰는 이유
- 복잡한 해시 로직 없이도 균등 분산 처리 가능
- 동일 키 값은 항상 같은 파티션으로: 사용자별 데이터 정합성 확보
- 쿼리 작성이 간편하고 직관적: 설정 복잡도 최소화
- 파티션 프루닝 자동 적용: WHERE user_id = ? 조건은 자동 최적화
이러한 장점 때문에 KEY 파티션은 초기 시스템 설계 시 부담 없이 도입하기 좋다.
🔧 실무 팁
- 파티션 키로 자주 사용하는 컬럼(예: user_id, member_id)을 지정하자
- 컬럼 값의 분포가 고르지 않으면 오히려 병목 발생 가능성 있음
- 파티션 수는 4, 8, 16처럼 2의 제곱수로 설정하는 것이 가장 안정적
- KEY 파티션은 PRIMARY KEY 또는 UNIQUE KEY에 반드시 포함되어야 함
- 파티션 수 변경은 불가능: 테이블을 삭제하고 재생성해야 함
⚠️ 주의 사항
- 내부 해시 알고리즘은 공개되어 있지 않음: 특정 파티션에 어떤 값이 저장될지 예측 불가
- 해시 키가 NULL일 경우: NULL은 별도로 해시되어 분산되지만, 예측이 어려움
- 해시 충돌로 인한 특정 파티션 쏠림 현상 가능성 존재
- 트랜잭션 병렬 처리에 유리하지만 데이터 분석용 쿼리에는 부적합할 수 있음
🔄 KEY 파티션이 잘 맞는 상황
- 사용자 ID 또는 세션 ID 기반으로 데이터가 지속적으로 쌓일 때
- 분류 코드나 조건 없이 데이터가 무작위로 들어오는 경우
- 시스템에서 파티션 전략을 쉽게 유지하고 싶을 때
- 복잡한 설정 없이 균등 분산이 필요한 운영 환경
특히 로그, 사용자 행동 이력, 주문 테이블 등 고속 INSERT/SELECT가 빈번한 테이블에서 효과가 크다.
✅ 정리
- KEY 파티션은 MySQL이 자동으로 해시 분산 처리해주는 파티셔닝 방식이다.
- 설정이 단순하고 실수 가능성이 낮아 도입이 쉬우며 안정적이다.
- = 조건의 WHERE 절에 강하고, 파티션 프루닝이 자동으로 적용된다.
- 해시 알고리즘이 내부적으로 처리되므로, 결정 제어가 필요 없는 시스템에 적합하다.
- 변경이 불가능한 구조이므로 초기 설계 시 파티션 수와 키 컬럼을 신중하게 결정해야 한다.
🔗 공식 문서 참고
MySQL 8.0 Reference Manual - KEY Partitioning
'DB' 카테고리의 다른 글
| [MySQL] (권한관리2️⃣) GRANT 명령어 완전 정복: 실전 예제 모음 (1) | 2025.07.10 |
|---|---|
| [MySQL] (권한관리1️⃣) 사용자 계정과 권한 구조 완벽 이해하기 (1) | 2025.07.09 |
| [MySQL] 대용량 테이블 분할 실전 사례와 쿼리 튜닝 효과 (1) | 2025.07.09 |
| [MySQL] 파티션 설계 시 주의할 점과 실무 적용 팁 🚨 (2) | 2025.07.09 |
| [MySQL] HASH 파티션 전략: 균등 분산의 핵심 알고리즘 ⚙️ (1) | 2025.07.08 |
| [MySQL] LIST 파티션 전략: 특정 값 기준 분할 방법 (0) | 2025.07.08 |
| [MySQL] RANGE 파티션 전략: 날짜 기반 분할 실무 예제 📆 (2) | 2025.07.08 |
| [MySQL] 파티셔닝(Partitioning) 개념과 사용 목적 총정리 📦 (0) | 2025.07.08 |