• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 1. MySQL Partitioning 개요
    2. Partitioning Types
    1. RANGE 파티셔닝
    2. LIST 파티셔닝
    3. COLUMNS 파티셔닝
    4. HASH 파티셔닝
    5. KEY 파티셔닝
    6. 서브 파티셔닝
    7. MySQL Partitioning NULL 처리
    3. 파티션 관리
    4. Partition Pruning
    5. 파티션 선택
    6. 파티셔닝 제약 및 제한
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

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).

서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved