이번 글에서는 ORACLE과 MySQL의 파티션 테이블 구문의 차이점에 대해서 알아보겠습니다.

ORACLE / MySQL partition DDL 차이점

기능ORACLEMySQL
ADDALTER TABLE PARTITION_TEST ADD PARTITION P1 VALUES LESS THAN (‘2020-03-01’) TABLESPACE TABS1ALTER TABLE PARTITION_TEST ADD PARTITION (PARTITION P1 VALUES LESS THAN (‘2020-03-01’) TABLESPACE TABS1)
DROPALTER TABLE PARTITION_TEST DROP PARTITION P1ALTER TABLE PARTITION_TEST DROP PARTITION P1
SPLITALTER TABLE SPLIT PARTITION P_MAX AT (‘2020-04-01’) INTO (PARTITION P2 TABLESPACE TABS2, PARTITION P_MAX TABLESPACE TABS)ALTER TABLE PARTITION_TEST REORGANIZE PARTITION P1,P2 INTO (PARTITION P2 LESS THAN (‘2020-04-01’))
MERGEALTER TABLE PARTITION_TEST MERGE PARTITION P1,P2 INTO P2ALTER TABLE PARTITION_TEST REORGANIZE PARTITION P1,P2 INTO (PARTITION P2 LESS THAN (‘2020-04-01’))
TRUNCATEALTER TABLE PARTITION_TEST TRUNCATE PARTITION P1ALTER TABLE PARTITION_TEST TRUNCATE PARTITION P1
EXCHANGEALTER TABLE PARTITION_TEST EXCHANGE PARTITION P1 WITH TABLE NONPARTITION_TESTALTER TABLE PARTITION_TEST EXCHANGE PARTITION P1 WITH TABLE NONPARTITION_TEST
MOVEALTER TABLE PARTITION_TEST MOVE PARTITION P1 TABLESPACE TABS1-
RENAMEALTER TABLE PARTITION_TEST RENAME PARTITION P1 TO P1_RENAME-

이외에도 아래와 같은 차이점이 더 있습니다

  • MySQL 은 global index가 지원되지 않음, (local index는 지원)
  • MySQL의 partition key column은 UK,PK에 포함되어야함

exchange partition without validation

ORACLE에는 기존에도 있는 기능이었지만 MySQL에는 5.7 버전 부터 생긴 기능으로
기존엔 파티셔닝 되어 있지 않은 source table에 partition 정의에 맞지 않는
데이터가 들어있지는 않은지 1행씩 데이터를 읽어 확인하던 것을 skip 하는 기능입니다.

아래와 같이 partition_test 테이블의 파티션 p1을 partition_test_archivce 로 옮길 때 사용할 수 있습니다.

  • partition_test : 서비스에서 사용중인 파티션 테이블
  • partition_test_tmp : partition_test와 같은 구조의 일반 테이블
  • partition_test_archive : 파티션 테이블의 아카이브용 테이블
mysql> alter table partition_test exchange partition p1 with table partition_test_tmp;
Query OK, 0 rows affected (0.09 sec)

### without validation 옵션 줬을 때 
mysql> alter table partition_test_archive exchange partition p1 with table partition_test_tmpwithout validation;
Query OK, 0 rows affected (0.08 sec)

### without validation 옵션 없을 때 
mysql> alter table partition_test_archive exchange partition p1 with table partition_test_tmp;
Query OK, 0 rows affected (1.89 sec)

=>partition_test_tmp의 데이터를 partition_test_archive로 옮길때
without validation 옵션을 사용하면 일반테이블의 데이터를 1행 씩 확인하는 과정이 skip 되기 때문에
속도가 훨씬 빠른 것을 확인할 수 있습니다.