MySQL에서는 대용량 데이터 관리를 위해 파티셔닝을 지원한다
(스토리지가 MyISAM이나 InnoDB 상관없이 지원하며 5.1 이상부터 지원)
우선 파티션을 나누기전에 CREATE시에 파티션을 설정해줘야 하며 그 이후부터 파티션추가는 ALTER 문으로 가능하다.
즉, 이미 파티션을 나누지 않은 일반 테이블이 있다면 삭제 후 다시 CREATE를 해줘야 한다.
파티션을 추가하는 것은 아래와 같다
CREATE TABLE `테이블` (
...
)
PARTITION BY RANGE (to_days(날짜컬럼)) (
PARTITION p201709 VALUES LESS THAN ( to_days('2017-08-01 00:00:00') )
ENGINE=InnoDB,
PARTITION p_max VALUES LESS THAN MAXVALUE ENGINE=InnoDB
);
위 파티션을 월단위로 파티션을 나눠놓은것으로 month함수는 지원하지 않으므로 to_days 함수를 통해 날짜컬럼을 기준으로 RANGE
형태
파티션을 나눈 것이다.(그래서 THAN() 에서 괄호안에 보통 날짜를 입력하면 되지만 unix time값으로 작성해야 하므로 함수를
이용)
여기서 주의할 점은 CREATE문이 생략됏는데, PRIMARY KEY를 보통 AI만 할텐데, 반드시 파티션을 나누는 기준이 되는 날짜컬럼을
같이 지정해줘야 한다.
즉, AI 값과 파티션 기준값을 같이 묶어서 PK로 지정해줘야 한다.
파티션을 년단위로 나눌경우는 to_days함수대신 year함수를 쓰면되고 THAN(값)에는 년도를 입력하면 된다.
파티션으로 나눠놓은 날짜보다 더 이전의 날짜의 데이터는 최소단위 파티션에 쌓이고, 그보다 더 큰 날짜의 데이터는 MAXVALUE로 지정한
p_max(예시) 에 쌓인다.
파티션 추가는 아래 명령어를 사용하며, 해당 날짜에 맞춰서 기존 데이터가 생성된 파티션으로 이동한다.
ALTER TABLE `테이블` PARTITION BY RANGE(함수(`필드명`)) (
PARTITION `파티션명` VALUES LESS THAN (값),
PARTITION `파티션명` VALUES LESS THAN (값)
)
여기서 주의할점은 이미 MAXVALUE가 설정이 된 경우는 마지막 날짜 기준 뒤의 날짜는 파티션추가가 안되므로 파티션을 재구성
해야한다
파티션 재구성은 아래와 같다
ALTER TABLE TBL_REQUEST_RESULT REORGANIZE PARTITION p_max INTO (
PARTITION p201710 VALUES LESS THAN (to_days('2017-09-01 00:00:00'))
ENGINE=InnoDB,
PARTITION p_max VALUES LESS THAN MAXVALUE ENGINE = InnoDB
);
파티션 삭제는 아래 명령어를 사용하며, 해당 파티션에 저장된 데이터는 삭제된다.
ALTER TABLE `테이블` DROP PARTITION `파티션명`;
파티션 확인 및 관리 명령어는 아래와 같다.
SHOW VARIABLES LIKE '%partition%'
ALTER TABLE REBUILD PARTITION;
ALTER TABLE OPTIMIZE PARTITION;
ALTER TABLE ANALYZE PARTITION;
ALTER TABLE REPAIR PARTITION;
ALTER TABLE CHECK PARTITION;
파티션 완전 삭제 명령어는 아래와 같다.
ALTER TABLE `테이블` REMOVE PARTITIONING;