VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
파티셔닝이 도움이 될 때
파티션 프루닝은 다음 경우에 실질적인 이득을 줍니다:- 테이블이 버퍼 풀에 들어가기에 너무 크고, 쿼리가 일관되게 파티션 키로 필터링할 때
- 오래된 데이터를 정기적으로 삭제할 때 —
ALTER TABLE t DROP PARTITION p_old는 느린 DELETE와 달리 즉시 끝납니다
- 쿼리가 파티션 키로 필터링하지 않을 때 (모든 파티션을 스캔해야 함)
- 테이블이 메모리에 충분히 들어갈 때
- 제대로 된 인덱싱을 대신하려 할 때 — 파티셔닝하지 않은 테이블의 좋은 인덱스가, 맞는 인덱스가 없는 파티셔닝된 테이블보다 나은 경우가 많습니다
RANGE 파티셔닝
파티션 키가 어떤 범위에 속하는지에 따라 행이 파티션에 배정됩니다. 가장 흔한 사용 사례는 날짜 기반 보관입니다.MAXVALUE 파티션을 포함하세요. 그것이 없으면 정의된 범위 밖의 삽입은 오류로 실패합니다.
새 파티션 추가하기:
LIST 파티셔닝
파티션 키의 정확한 값에 따라 행이 배정됩니다.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로 할 수 있습니다:
행이 어느 파티션에 있는지 어떻게 확인하나요?
EXPLAIN PARTITIONS를 사용하세요.
문제 해결
함께 보기
- InnoDB가 데이터를 저장하는 방식 — 파티셔닝이 동작하는 스토리지 엔진
- MySQL 인덱스의 동작 방식 — 파티션 안의 인덱스와 파티션 프루닝
- MySQL의 스키마 마이그레이션 — 기존 테이블에 파티셔닝을 추가하거나 바꾸는 방법