DB

[MySQL] HASH 파티션 전략: 균등 분산의 핵심 알고리즘 ⚙️

인생아 2025. 7. 8. 23:57
반응형

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

반응형