메인 콘텐츠로 건너뛰기

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
파티셔닝은 하나의 논리적 테이블을 여러 물리적 세그먼트로 나눕니다. MySQL은 파티셔닝 표현식에 따라 행을 파티션으로 보내고, 파티션 키로 필터링하는 쿼리는 파티션을 통째로 건너뛸 수 있습니다 — 이 최적화를 파티션 프루닝이라고 합니다. 파티셔닝에는 InnoDB 또는 NDB 스토리지 엔진이 필요합니다.

파티셔닝이 도움이 될 때

파티션 프루닝은 다음 경우에 실질적인 이득을 줍니다:
  • 테이블이 버퍼 풀에 들어가기에 너무 크고, 쿼리가 일관되게 파티션 키로 필터링할 때
  • 오래된 데이터를 정기적으로 삭제할 때 — ALTER TABLE t DROP PARTITION p_old는 느린 DELETE와 달리 즉시 끝납니다
파티셔닝은 다음 경우에는 도움이 되지 않습니다:
  • 쿼리가 파티션 키로 필터링하지 않을 때 (모든 파티션을 스캔해야 함)
  • 테이블이 메모리에 충분히 들어갈 때
  • 제대로 된 인덱싱을 대신하려 할 때 — 파티셔닝하지 않은 테이블의 좋은 인덱스가, 맞는 인덱스가 없는 파티셔닝된 테이블보다 나은 경우가 많습니다

RANGE 파티셔닝

파티션 키가 어떤 범위에 속하는지에 따라 행이 파티션에 배정됩니다. 가장 흔한 사용 사례는 날짜 기반 보관입니다.
정의된 어떤 범위에도 맞지 않는 행을 받기 위해 항상 MAXVALUE 파티션을 포함하세요. 그것이 없으면 정의된 범위 밖의 삽입은 오류로 실패합니다. 새 파티션 추가하기:
오래된 데이터를 즉시 삭제하기:

LIST 파티셔닝

파티션 키의 정확한 값에 따라 행이 배정됩니다.
어떤 파티션에도 나열되지 않은 region 값을 삽입하면 실패합니다. 문자열 열에는 LIST COLUMNS를 사용하세요 — LIST만으로는 정수 표현식만 지원합니다.

HASH와 KEY 파티셔닝

HASH와 KEY는 고정된 수의 파티션에 행을 고르게 분배합니다. 값에 의한 파티션 프루닝은 지원하지 않지만, 행을 여러 파티션에 분산시켜 동시 쓰기 처리량을 높일 수 있습니다.

파티션 프루닝

프루닝은 WHERE 절이 파티션 표현식을 직접 필터링할 때만 동작합니다. RANGE COLUMNS (created_at)에서는 created_at으로 필터링하면 올바르게 프루닝됩니다:
프루닝을 확인하려면 EXPLAIN을 실행하고 partitions 열을 보세요:
partitions에 파티션 이름이 하나 또는 몇 개만 보이면 프루닝이 동작하는 것입니다. 모든 파티션이 보이면 필터가 적용되지 않는 것입니다.

파티셔닝 제약

  • 모든 고유 키(기본 키 포함)는 파티셔닝 표현식의 모든 열을 포함해야 합니다. created_at으로 파티셔닝하려면 모든 고유 키에 created_at이 있어야 합니다 — 독립된 PRIMARY KEY (id)가 있는 테이블에는 먼저 PRIMARY KEY (id, created_at)으로 바꾸지 않는 한 파티션을 추가할 수 없습니다.
  • MySQL의 파티셔닝된 테이블에서는 FOREIGN KEY 제약 조건이 지원되지 않습니다.
  • 테이블 하나는 최대 8192개의 파티션을 가질 수 있습니다 (MySQL 8.0 이상).

파티셔닝 대 인덱싱

인덱싱부터 시작하세요. 큰 테이블에서 입증된 성능 문제가 있고 쿼리 패턴에 맞는 명확한 파티션 키가 있을 때만 파티셔닝을 추가하세요.

자주 묻는 질문

기존 테이블을 파티셔닝할 수 있나요?

예, ALTER TABLE로 할 수 있습니다:
이 작업은 테이블을 다시 쓰므로, 큰 테이블에서는 상당한 시간과 디스크 공간이 들 수 있습니다.

행이 어느 파티션에 있는지 어떻게 확인하나요?

특정 행이 어느 파티션으로 갈지 보려면, 그 행과 일치하는 WHERE 절과 함께 EXPLAIN PARTITIONS를 사용하세요.

문제 해결

함께 보기