본문 바로가기

데이터베이스(DA, AA, TA)/MySQL

[MySQL] MySQL 파티션 제약사항

MySQL의 파티션은 5.1 버전부터 도입됐지만 아직은 많은 제약을 지니고 있습니다. 물론 MySQL 5.5 버전에서 해결된 문제도 있지만 아직 MySQL의 파티션은 모두에게 익숙하지 않으므로 자세한 제약사항을 한번 살펴보겠습니다.


- 숫자값(INTEGER 타입 컬럼 또는 INTEGER 타입을 반환하는 함수 및 표현식)에 의해서만 파티션이 가능합니다.

  MySQL 5.5 부터는 숫자 타입뿐 아니라 문자열이나 날짜 타입 모두 사용할 수 있도록 개선되었습니다. 


- 키 파티션은 해시 함수를 MySQL이 직접 선택하기 때문에 컬럼 타입 제한이 없습니다.


- 최대 1024개의 파티션을 가질 수 있습니다. (서브 파티션까지 포함)


- 스토어드 루틴이나 UDF 그리고 사용자 변수 등을 파티션 함수나 식에 사용할 수 없습니다.


- 파티션 생성 이후 MySQL 서버의 sql_mode 파라미터 변경은 추천하지 않습니다.


- 파티션 테이블에서는 외래키 사용이 불가능합니다.


- 파티션 테이블은 전문 검색 인덱스 생성이 불가능합니다.


- 공간 확장 기능에서 제공되는 컬럼 타입(POINT, GEOMETRY, ..)은 파티션 테이블에서 사용이 불가능합니다.


- 임시 테이블(Temporary table)은 파티션 기능 사용 불가능 합니다.


- MyISAM 파티션 테이블의 경우 키 캐시를 사용할 수 없습니다.

  (MySQL 5.5 부터 이 버그는 보완되었습니다.)


- 파티션 키의 표현식은 일반적으로 컬럼 그 자체 또는 MySQL 내장 함수를 사용할 수 있는데, 여기서 MySQL 내장 함수를 모두 사용할 수 있는 것이 아니라 일부만 사용할 수 있습니다. (자세한 함수 목록은 현재 사용중인  MySQL 버전의 매뉴얼을 참고합니다.) 하지만 이 함수 중에서도 정상적으로 파티션 프루닝(Pruning)을 지원하는 함수는 YEAR()와 TO_DAYS(), TO_SECONDS()밖에 없으므로 제대로 파티션의 기능을 이용하려고 한다면 INTEGER 타입의 컬럼 그 자체 또는 이 3가지 내장 함수를 사용한 표현식을 파티션 키로 사용할 것을 권장합니다. (TO_SECONDS 함수는 MySQL 5.5부터 지원됩니다.)



MySQL의 파티션에서 인덱스는 로컬이나 글로벌의 의미가 없이 모두 로컬 인덱스이며, 같은 테이블에 소속돼 있는 모든 파티션은 같은 구조의 인덱스만 가질 수 있습니다. 즉 파티션 단위로 인덱스를 변경하거나 추가할 수 없습니다. 또한 하나의 테이블에 소속된 파티션은 다른 종류의 스토리지 엔진으로 구성하는 것을 추천하지 않습니다. 위의 제약사항을 고려해 보면 MySQL 5.1에서는 INTEGER 컬럼과  DATE(또는 DATETIME) 타입의 컬럼으로 파티션된 테이블만 제대로 된 기능(파티션 생성 및 파티션 프루닝)을 활용할 수 있을 것으로 보입니다.


MySQL 5.1 이상의 버전에서 파티션 표현식에 사용할 수 있는 함수 리스트.

ABS(), CELING(), DAY(), DAYOFMONTH(), DAYOFWEEK(), DAYOFYEAR(), DATEDIFF(), EXTRACT(), FLOOR(), HOUR(), MICROSECOND(), MINUTE(), MOD(), MONTH(), QUARTER(), SECOND(), TIME_TO_SEC(), TO_DAYS(), WEEKDAY(), YEAR(), YEARWEEK()