19.2.6 서브 파티셔닝
서브 파티셔닝 (복합 파티셔닝이라고도 함)는 분할 된 테이블의 각 파티션을 나눌 것입니다. 다음 CREATE TABLE
문을 검토합니다.
CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) SUBPARTITION BY HASH( TO_DAYS(purchased) ) SUBPARTITIONS 2 ( PARTITION p0 VALUES LESS THAN (1990), PARTITION p1 VALUES LESS THAN (2000), PARTITION p2 VALUES LESS THAN MAXVALUE );
테이블 ts
에는 3 개의 RANGE
파티션이 있습니다. 이러한 각 파티션 ( p0
, p1
및 p2
)는 두 개의 하위 분할됩니다. 사실, 전체 테이블이 3 * 2 = 6
분할됩니다. 그러나 PARTITION BY RANGE
절 작업을 수행하면이 첫번째 2 개에는 purchased
컬럼에서 값이 1990보다 작은 레코드 만 저장됩니다.
MySQL 5.6에서는 RANGE
또는 LIST
에 의해 분할 된 테이블을 서브 파티션을 생성합니다. 서브 파티셔닝은 HASH
또는 KEY
파티셔닝을 사용할 수 있습니다. 이것은 복합 파티셔닝이라고도합니다.
SUBPARTITION BY HASH
및 SUBPARTITION BY KEY
는 보통 각각 PARTITION BY HASH
및 PARTITION BY KEY
와 같은 구문 규칙에 따릅니다. 이 예외는 SUBPARTITION BY KEY
는 현재 ( PARTITION BY KEY
와 달리) 디폴트 컬럼을 지원하지 않는 것으로,이 목적에 사용되는 열을 지정해야합니다 (테이블에 명시적인 기본 키가있는 경우에도 ). 이것은 알려진 문제이며, 처리 중입니다. 자세한 내용 및 예제는 서브 파티션 문제 를 참조하십시오.
SUBPARTITION
절을 사용하여 개별 하위 파티션 옵션을 지정하여 하위 파티션을 명시 적으로 정의 할 수 있습니다. 예를 들어 앞의 예와 같은 테이블 ts
를 더 장황한 형식으로 만들려면 다음과 같이합니다.
CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) SUBPARTITION BY HASH( TO_DAYS(purchased) ) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0, SUBPARTITION s1 ), PARTITION p1 VALUES LESS THAN (2000) ( SUBPARTITION s2, SUBPARTITION s3 ), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s4, SUBPARTITION s5 ) );
구문에 대한 몇 가지주의 사항은 다음과 같습니다.
각 파티션에는 같은 수의 서브 파티션이 필요합니다.
파티션 된 테이블의 파티션에
SUBPARTITION
를 사용하여 하위 파티션을 명시 적으로 정의 할 경우, 그들 모두를 정의해야합니다. 즉, 다음 명령문은 실패합니다.CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) SUBPARTITION BY HASH( TO_DAYS(purchased) ) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0, SUBPARTITION s1 ), PARTITION p1 VALUES LESS THAN (2000), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s2, SUBPARTITION s3 ) );
이 문은
SUBPARTITIONS 2
구를 포함하더라도 실패합니다.각
SUBPARTITION
절에는 (적어도) 서브 파티션의 이름이 포함되어 있어야합니다. 그렇지 하위 파티션에 적절한 옵션을 설정하거나 그 옵션의 기본 설정을 가정합니다.서브 파티션 이름은 테이블에서 고유해야합니다. 예를 들어, 다음의
CREATE TABLE
문은 MySQL 5.6에서 사용할 수 있습니다.CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) SUBPARTITION BY HASH( TO_DAYS(purchased) ) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0, SUBPARTITION s1 ), PARTITION p1 VALUES LESS THAN (2000) ( SUBPARTITION s2, SUBPARTITION s3 ), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s4, SUBPARTITION s5 ) );
하위 파티션은 매우 큰 테이블에서 데이터 및 인덱스를 여러 디스크에 분산하는 데 사용할 수 있습니다. /disk0
/ /disk1
/ /disk2
등으로 마운트 된 6 개의 디스크가 있다고합니다. 여기에서 다음의 예를 검토합니다.
CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) SUBPARTITION BY HASH( TO_DAYS(purchased) ) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0 DATA DIRECTORY = '/disk0/data' INDEX DIRECTORY = '/disk0/idx', SUBPARTITION s1 DATA DIRECTORY = '/disk1/data' INDEX DIRECTORY = '/disk1/idx' ), PARTITION p1 VALUES LESS THAN (2000) ( SUBPARTITION s2 DATA DIRECTORY = '/disk2/data' INDEX DIRECTORY = '/disk2/idx', SUBPARTITION s3 DATA DIRECTORY = '/disk3/data' INDEX DIRECTORY = '/disk3/idx' ), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s4 DATA DIRECTORY = '/disk4/data' INDEX DIRECTORY = '/disk4/idx', SUBPARTITION s5 DATA DIRECTORY = '/disk5/data' INDEX DIRECTORY = '/disk5/idx' ) );
이 경우 각 RANGE
데이터 및 인덱스에 개별 디스크가 사용됩니다. 그 밖에도 다수의 변형이있을 수 있습니다. 또 다른 예를 보여줍니다.
CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE(YEAR(purchased)) SUBPARTITION BY HASH( TO_DAYS(purchased) ) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0a DATA DIRECTORY = '/disk0' INDEX DIRECTORY = '/disk1', SUBPARTITION s0b DATA DIRECTORY = '/disk2' INDEX DIRECTORY = '/disk3' ), PARTITION p1 VALUES LESS THAN (2000) ( SUBPARTITION s1a DATA DIRECTORY = '/disk4/data' INDEX DIRECTORY = '/disk4/idx', SUBPARTITION s1b DATA DIRECTORY = '/disk5/data' INDEX DIRECTORY = '/disk5/idx' ), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s2a, SUBPARTITION s2b ) );
이 경우 다음과 같이 저장됩니다.
purchased
날짜가 1990 년 이전 행에 큰 공간이 사용되기 때문에 4 개로 분할 된 파티션p0
를 구성하는 2 개의 각 하위 파티션 (s0a
및s0b
) 데이터 및 인덱스에 개별 디스크 전용 에 할당됩니다. 즉, 다음과 같이됩니다.서브 파티션
s0a
데이터/disk0
에 저장됩니다.서브 파티션
s0a
의 인덱스는/disk1
에 저장됩니다.서브 파티션
s0b
데이터는/disk2
에 저장됩니다.서브 파티션
s0b
의 인덱스는/disk3
에 저장됩니다.
1990 년부터 1999 년까지의 날짜 (파티션
p1
)이 포함 된 행은 1990 년 이전의 행 정도의 공간이 필요하지 않습니다. 이들은p0
에 저장된 기존 레코드의 경우 4 개의 디스크가 아닌 2 개의 디스크 (/disk4
및/disk5
)로 분할됩니다.p1
의 첫 번째 서브 파티션 (s1a
)에 속하는 데이터 및 인덱스/disk4
(데이터/disk4/data
및 인덱스/disk4/idx
)에 저장됩니다.p1
의 두 번째 하위 파티션 (s1b
)에 속하는 데이터 및 인덱스/disk5
(데이터/disk5/data
및 인덱스/disk5/idx
)에 저장됩니다.
2000 년부터 현재까지의 날짜 (파티션
p2
)를 반영하는 행에는 이전의 2 개의 범위에서 필요로하는만큼의 공간이 사용되지 않습니다. 현재 이러한 모든 기본 위치에 저장해도 문제 없습니다.향후 2000 년부터 시작되는 10 년간의 구매 개수가 기본 위치에 충분한 공간을 제공 할 수 없을 정도로 늘어난 경우에는
ALTER TABLE ... REORGANIZE PARTITION
명령문을 사용하여 해당 행을 이동할 수 있습니다. 이렇게하는 방법에 대한 자세한 내용은 섹션 19.3 "파티션 관리" 를 참조하십시오.
NO_DIR_IN_CREATE
서버 SQL 모드가 활성화되면, DATA DIRECTORY
및 INDEX DIRECTORY
옵션은 파티션 정의에서 허용되지 않습니다. MySQL 5.6에서는 이러한 옵션은 서브 파티션을 정의 할 경우에도 허용되지 않습니다 (Bug # 42954).