MySQL에서 대용량 데이터를 빠르게 처리하고 싶지만, 분할 기준이 딱히 명확하지 않을 때 사용할 수 있는 파티셔닝 방식이 있다.
바로 HASH 파티션이다.
이 방식은 데이터를 지정한 컬럼 값의 해시 결과에 따라 자동으로 균등 분산하는 전략이다.
RANGE나 LIST처럼 명시적인 기준 없이, 내부적으로 나눠주는 게 핵심이다.

✅ HASH 파티션이란?
HASH 파티션은 지정된 컬럼(또는 여러 컬럼 조합)의 해시값을 기준으로 데이터를 지정한 개수의 파티션에 균등하게 분산시킨다.
예를 들어 user_id를 기준으로 해시 파티션을 나누면, 사용자별 데이터가 랜덤하게 분배된다.
사용 방식은 매우 단순하다.
PARTITION BY HASH(user_id) PARTITIONS 4
이 설정은 user_id의 값을 해시 처리하여 4개의 파티션 중 하나에 자동으로 분산시킨다.
값이 어떤 숫자건 상관없다. 내부적으로 HASH(user_id) % 4 계산으로 분할된다.
🧪 실전 예제: 사용자 ID 기반 해시 파티션
CREATE TABLE user_actions (
id BIGINT NOT NULL,
user_id INT NOT NULL,
action_time DATETIME NOT NULL,
action_type VARCHAR(100),
PRIMARY KEY (id, user_id)
)
PARTITION BY HASH(user_id)
PARTITIONS 4;
이 테이블은 다음과 같은 구조로 분할된다.
- user_id를 해시 처리하여 PARTITION 0 ~ 3 중 하나에 자동 저장
- 어떤 user_id가 어떤 파티션에 들어가는지는 사용자가 알 필요 없음
- 쿼리는 기존 테이블처럼 동일하게 사용
SELECT * FROM user_actions WHERE user_id = 12345;
이 쿼리를 실행하면, MySQL은 12345를 해시 처리해서 정확히 1개의 파티션만 검색한다.
즉, 불필요한 파티션 스캔이 없다는 점이 장점이다.
📦 HASH 파티션의 주요 특징
- 명시적 기준 없이 자동 균등 분산
- 일관된 해시 로직 덕분에 동일한 값은 항상 같은 파티션으로 들어간다
- 동적 삭제/추가 불가: 파티션 수를 늘리려면 테이블 재생성이 필요
- 범위 조건 쿼리에는 불리함: BETWEEN, >=, <= 조건은 모든 파티션을 탐색해야 함
- 균등 분산이므로 일부 쿼리에만 최적화
📌 언제 HASH 파티션을 쓰는가?
다음과 같은 상황에서 매우 효과적이다.
- 분할 기준이 명확하지 않음 (날짜나 코드가 없음)
- 특정 컬럼에 대해 = 또는 IN 조건 쿼리가 대부분인 경우
- 사용자가 많은 앱에서 user_id, account_id 등으로 트랜잭션이 발생하는 경우
- 대용량 INSERT 시 디스크 I/O 병목을 분산하고 싶을 때
예를 들어, 쇼핑몰의 사용자 행동 로그가 하루에 수천만 건 쌓일 때
user_id 기준 HASH 파티션을 사용하면 INSERT와 SELECT 모두 병렬화 효과를 누릴 수 있다.
🔍 성능 측면에서 기대 효과
- 단일 파티션만 조회할 수 있으므로 특정 키 쿼리는 매우 빠르다
- INSERT 시에도 병렬로 분산되므로 디스크 및 메모리 I/O가 나눠짐
- 파티션 당 인덱스 크기가 줄어들어 B-Tree 탐색 속도 개선
다만, BETWEEN, LIKE, RANGE 조건은 모든 파티션을 조회해야 하므로 오히려 느려질 수 있다.
🔧 실무 팁: HASH 파티션 최적화 포인트
- 파티션 개수는 반드시 2의 제곱수 형태(4, 8, 16, 32...)가 좋다
- 해시 키는 고르게 분포되는 컬럼을 사용해야 효과가 있다
- user_id, session_id, order_no 등이 적절한 예
- 해시 키로 ENUM, NULL 허용 컬럼, 중복 값 많은 필드는 피해야 한다
- 중간에 파티션 수를 변경할 수 없으므로 처음부터 충분히 크게 설계하는 것이 좋다
⚠️ 주의할 점
- ALTER TABLE로 파티션 수 늘릴 수 없다: 테이블 재생성 필요
- 모든 파티션의 구조는 동일해야 한다: 각 파티션에 다른 스키마 지정 불가
- 트랜잭션 기반 대용량 삭제 시 ALL 파티션 탐색 가능성 존재
- 해시 충돌 시 특정 파티션 쏠림 현상 가능: 컬럼 선택 신중히 해야 함
🔄 HASH vs RANGE vs LIST 차이
| 항목 | HASH 파티션 | RANGE 파티션 | LIST 파티션 |
| 분할 기준 | 해시 함수 | 값 범위 | 명시된 목록 값 |
| 사용 목적 | 균등 분산 | 날짜/수치 범위 분할 | 코드/구분값 분할 |
| WHERE 최적화 | = 조건에 효과적 | 범위 조건에 효과적 | = / IN 조건에 효과적 |
| 파티션 개수 변경 | 불가 (재생성 필요) | 일부 ALTER 가능 | 일부 ALTER 가능 |
즉, 명확한 기준 없이도 균등하게 분산하고 싶을 때 HASH는 강력한 선택지가 된다.
✅ 정리
- HASH 파티션은 명시적 분할 기준이 없을 때 가장 간단하고 강력한 파티션 방식이다.
- 특정 키값으로 분산이 잘 이루어지는 구조라면 뛰어난 성능 향상을 기대할 수 있다.
- 하지만 WHERE 절이 해시 키와 무관하거나, 범위 조건일 경우에는 모든 파티션을 탐색하므로 성능 저하 가능성이 있다.
- 처음 설계할 때부터 파티션 수와 분산 컬럼을 신중하게 결정하는 것이 핵심이다.
🔗 공식 문서 참고
MySQL 8.0 Reference Manual - HASH Partitioning
'DB' 카테고리의 다른 글
| [MySQL] (권한관리1️⃣) 사용자 계정과 권한 구조 완벽 이해하기 (1) | 2025.07.09 |
|---|---|
| [MySQL] 대용량 테이블 분할 실전 사례와 쿼리 튜닝 효과 (1) | 2025.07.09 |
| [MySQL] 파티션 설계 시 주의할 점과 실무 적용 팁 🚨 (2) | 2025.07.09 |
| [MySQL] KEY 파티션 전략: 자동 해시로 분산 처리하기 🔑 (1) | 2025.07.09 |
| [MySQL] LIST 파티션 전략: 특정 값 기준 분할 방법 (0) | 2025.07.08 |
| [MySQL] RANGE 파티션 전략: 날짜 기반 분할 실무 예제 📆 (2) | 2025.07.08 |
| [MySQL] 파티셔닝(Partitioning) 개념과 사용 목적 총정리 📦 (0) | 2025.07.08 |
| [MySQL] 쿼리 리팩토링 전/후 실행계획으로 성능 변화 분석하기 🔍 (0) | 2025.07.08 |