DB

[MySQL] 파티션 설계 시 주의할 점과 실무 적용 팁 🚨

인생아 2025. 7. 9. 01:38
반응형

MySQL의 파티셔닝 기능은 대용량 데이터를 효율적으로 관리하고, 쿼리 성능을 향상시키는 매우 강력한 도구다.
하지만 제대로 설계하지 않으면 오히려 성능이 더 나빠지거나 예기치 않은 장애로 이어질 수 있다.
파티션 테이블은 일반 테이블과 동작 방식이 다르기 때문에 설계 단계부터 반드시 고려해야 할 요소들이 존재한다.

✅ 파티션 키 선정은 성능의 80%를 좌우한다

파티션을 어떤 컬럼 기준으로 나눌지는 설계의 핵심이다.
파티션 키는 WHERE 절에서 자주 사용되는 컬럼이면서, 데이터가 고르게 분산될 수 있는 컬럼이어야 한다.
다음과 같은 컬럼은 피하는 것이 좋다.

  • 중복이 많은 컬럼 (예: 성별, 회원등급 등)
  • NULL 값이 빈번한 컬럼
  • 사용 빈도가 낮은 보조 컬럼

대신 다음 조건을 만족하는 컬럼을 추천한다.

  • 자주 사용하는 조건절에 등장 (WHERE user_id = ?, WHERE created_at >= ?)
  • INSERT와 SELECT 양쪽에 자주 쓰임
  • 값이 분산되어 있고 균등한 범위를 가짐

예: created_at, user_id, region_code, category_id 등

반응형

⚠️ 파티션 수는 무조건 많다고 좋은 게 아니다

많은 사람들이 착각하는 부분 중 하나는 파티션 수를 많이 만들면 성능이 무조건 좋아진다는 것이다.
하지만 너무 많은 파티션은 오히려 다음과 같은 문제를 야기한다.

  • 메타데이터 오버헤드 증가 (파티션마다 인덱스/통계 정보 유지됨)
  • SELECT 쿼리 시 프루닝이 안 되면 모든 파티션을 순회
  • INSERT 시 파티션 탐색 오버헤드 발생
  • DDL 작업 시 시간 증가 (ALTER TABLE 등)

적정 파티션 수는 보통 4~16개 수준에서 시작하고, 성능 테스트 결과에 따라 조정하는 것이 안전하다.

🧱 PRIMARY KEY 또는 UNIQUE KEY 제약

파티션 테이블에서는 PRIMARY KEY 또는 UNIQUE KEY를 지정할 경우 반드시 파티션 키도 함께 포함되어야 한다.
그렇지 않으면 다음과 같은 오류가 발생한다.

ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function

예시:

-- 오류
CREATE TABLE example (
  id INT NOT NULL,
  name VARCHAR(50),
  PRIMARY KEY (id)
)
PARTITION BY HASH(name);

-- 해결
PRIMARY KEY (id, name)

실수로 파티션 키를 빠뜨리면, 설계 단계부터 전면 수정이 필요해진다.

반응형

📋 NULL 값 처리에 주의

파티션 키에 NULL이 포함될 경우, MySQL은 다음과 같이 처리한다.

  • RANGE 파티션: NULL은 첫 번째 파티션에 들어감
  • LIST 파티션: NULL은 명시적으로 VALUES IN(NULL)로 선언하지 않으면 INSERT 오류
  • HASH, KEY 파티션: NULL도 해시 처리되어 분산됨

이로 인해 예상치 못한 파티션 배치 또는 오류가 발생할 수 있으므로, NULL 허용 여부와 처리 방식은 반드시 사전에 확인해야 한다.

🔄 파티션 테이블의 제한사항

MySQL 파티션 테이블은 일반 테이블과는 다르게 다수의 기능 제약이 있다.

  • 외래 키(Foreign Key) 제약조건 불가
  • FULLTEXT, SPATIAL 인덱스 불가
  • GLOBAL 인덱스 지원되지 않음 (파티션마다 로컬 인덱스만 존재)
  • JSON, BLOB, TEXT 등 일부 데이터 타입 파티션 키로 불가
  • ALTER TABLE로 파티션 수 증가 불가 (재생성 필요)

이러한 제약을 모르고 도입하면 기존 시스템과 호환되지 않거나 개발 중단 상황이 발생할 수 있다.

🧠 실무 설계 시 꼭 체크할 질문 리스트

  1. 파티션 키가 WHERE 절에 반드시 들어가는가?
  2. 해당 컬럼이 균등하게 분산되는가?
  3. 파티션 개수는 데이터량 대비 적정한가?
  4. 파티션 키에 NULL 값이 포함될 수 있는가?
  5. UNIQUE 또는 PK 제약 조건은 파티션 키를 포함하는가?
  6. 성능 테스트를 통한 프루닝 효과가 확인되었는가?
  7. 1년 후, 3년 후에도 유지보수가 가능한 구조인가?

이 질문들에 모두 “YES”라고 답할 수 없다면, 파티션 도입을 재고해야 한다.

🔧 실전 적용 시 추천 시나리오

  • 로그성 데이터 테이블: created_at 기준 RANGE 파티션
  • 사용자별 대규모 테이블: user_id 기준 HASH 또는 KEY 파티션
  • 지역/국가 코드별 정형 데이터: region_code 기준 LIST 파티션
  • 카테고리 기반 검색이 많은 게시판: category_id 기준 LIST 또는 HASH 파티션

이처럼 파티션은 정말 필요한 곳에만, 구조에 맞춰 정교하게 도입해야 진가를 발휘한다.

✅ 정리

  • 파티션 설계는 데이터 분산, 쿼리 최적화, 유지보수까지 고려한 종합 설계 작업이다.
  • 키 선정, 수량 조절, NULL 처리, 제약 조건 충족 여부 등 다양한 요소를 함께 고려해야 한다.
  • 처음에 잘못 설계하면 데이터 이관, 쿼리 변경, 시스템 중단 등 대규모 리스크로 이어질 수 있다.
  • 충분한 사전 테스트와 반복 검증을 통해 도입하는 것이 가장 안전한 방식이다.

🔗 공식 문서 참고
MySQL 8.0 Reference Manual - Partitioning Limitations and Restrictions

반응형