database/mysql
[MySQL] 월별 Partition Table 생성, 수정, 삭제
moonsiri
2020. 10. 31. 03:33
728x90
반응형
MySQL에서 지원되는 Partition은 Range, List, Hash, Key의 4가지인데, 여기선 Range를 사용하겠습니다.
통계 데이터나 로그 데이터처럼 데이터량이 많을 경우, 파티션 키 위주로 조회를 자주 하거나 대량의 과거 데이터를 삭제 시 사용합니다.
로그 테이블을 하나 생성하겠습니다.
reg_ymdt 컬럼을 사용할 예정인데, Partition RANGE로 사용하려면 해당 테이블에 PK가 지정되어있지 않거나
PK가 지정되어있다면 reg_ymdt 컬럼이 PK로 등록되어야 합니다.
그리고 파티션 range key로 사용할 컬럼은 int 값 이어야 하는데, 날짜로 분리하기 위해 timestamp를 사용하겠습니다.
CREATE TABLE audit_log (
id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '일련번호',
reg_ymdt TIMESTAMP NOT NULL COMMENT '등록 년월일시간',
...
PRIMARY KEY (id, reg_ymdt),
KEY IDX_regYmdt (reg_ymdt)
)
파티션 등록
reg_ymdt로 월별 partition을 등록합니다.
ALTER TABLE audit_log
PARTITION BY RANGE (UNIX_TIMESTAMP(reg_ymdt)) (
PARTITION p_202010 VALUES LESS THAN (UNIX_TIMESTAMP('2020-11-01 00:00:00')),
PARTITION p_202011 VALUES LESS THAN (UNIX_TIMESTAMP('2020-12-01 00:00:00')),
PARTITION p_202012 VALUES LESS THAN (UNIX_TIMESTAMP('2021-01-01 00:00:00')),
PARTITION p_max VALUES LESS THAN (MAXVALUE)
);
생성된 파티션 조회
audit_log에 등록된 partition을 조회합니다.
SELECT TABLE_NAME, PARTITION_NAME, PARTITION_METHOD, PARTITION_EXPRESSION, PARTITION_DESCRIPTION
FROM information_schema.PARTITIONS
WHERE TABLE_NAME = 'audit_log';
파티션에 포함된 데이터 조회
audit_log의 파티션 p_202012에 속한 데이터를 조회합니다.
SELECT *
FROM audit_log PARTITION (p_202012);
파티션 수정(추가)
만약 p_max 없이 p_202101 파티션을 추가한다고 할 때,
파티션을 추가하기 전 audit_log 테이블에 '202101' 데이터가 들어가 있다면 아래 쿼리는 오류가 날 것입니다.
ALTER TABLE audit_log ADD PARTITION(PARTITION p_202101 VALUES LESS THAN (UNIX_TIMESTAMP('2021-02-01 00:00:00')));
혹시 모를 사고를 방지하여 p_max로 파티션을 분리하는 것을 추천합니다.
ALTER TABLE audit_log REORGANIZE PARTITION p_max INTO (
PARTITION p_202101 VALUES LESS THAN (UNIX_TIMESTAMP('2021-02-01 00:00:00')),
PARTITION p_max VALUES LESS THAN (MAXVALUE)
);
파티션 삭제
ALTER TABLE audit_log DROP PARTITION p_202010;
파티션을 타고 있는지 조회
reg_ymdt 컬럼으로 조회를 했을 경우, 어떤 파티션을 사용했는지 등의 정보를 조회합니다.
EXPLAIN PARTITIONS
SELECT * FROM audit_log
WHERE reg_ymdt BETWEEN '2020-12-11' AND '2020-12-19';
728x90
반응형