• 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.1 RANGE 파티셔닝

범위로 파티션 된 테이블은 각 파티션에있는 행의 분할 식 값이 지정된 범위에 맞게 분할됩니다. 범위는 연속하고 있지만 고유 한 것이어야하고, VALUES LESS THAN 연산자를 사용하여 정의됩니다. 다음의 몇 가지 예는 20 비디오 가게로 구성된 체인 (1부터 20까지의 번호가 붙어있다) 직원 레코드를 유지하는 다음과 같은 테이블을 만들고 있다고 가정 하십시오.

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
);
참고

여기에서 사용하는 employees 테이블에는 기본 키 또는 고유 키가 없습니다. 이러한 예는 여기에 설명을위한 것으로, 실제 테이블은 기본 키, 고유 키 또는 둘 모두를 갖추고있을 가능성이 매우 높고, 파티셔닝 컬럼에 사용할 수있는 옵션은 이러한 키 (있는 경우)에 사용되는 컬럼에 의존합니다. 이러한 사항은 섹션 19.6.1 "파티셔닝 키, 기본 키 및 고유 키" 를 참조하십시오.

이 테이블은 필요에 따라 여러 가지 방법으로 별 구분 작업을 수행 할 수 있습니다. 하나의 방법은 store_id 컬럼을 사용하는 것입니다. 예를 들어, 다음과 같이 PARTITION BY RANGE 절을 추가하여 테이블을 4 개의 파티션으로 분할하는 것을 확인할 수 있습니다.

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
    PARTITION p0 VALUES LESS THAN (6),
    PARTITION p1 VALUES LESS THAN (11),
    PARTITION p2 VALUES LESS THAN (16),
    PARTITION p3 VALUES LESS THAN (21)
);

이 파티셔닝 체계에서는 점포 1에서 점포 5에서 일하고있는 직원에 대응하는 모든 행이 파티션 p0 에 저장되며 점포 6에서 점포 10 직원이 파티션 p1 에 저장됩니다 (이하 동일). 각 파티션은 가장 작은 값에서 가장 큰 값 순으로 정의됩니다. 이것은 PARTITION BY RANGE 구문의 요구 사항입니다. 이것은 C 또는 Java 일련의 if ... elseif ... 문에 비슷하다고 생각할 수 있습니다.

데이터 (72, 'Michael', 'Widenius', '1998-06-25', NULL, 13) 이 포함되어있는 새 행이 파티션 p2 에 삽입되는 것은 쉽게 알 수 있지만,이 체인에 21 번째 점포가 추가되면 어떻게 될까요. 이 제도는 store_id 가 20보다 큰 행에 대응하는 규칙이없이 서버는 어디에 두어야하는지 모르기 때문에 오류가 발생합니다. 이것이 발생하지 않도록하려면 "모든 상황에 대응하는" VALUES LESS THAN 절을 CREATE TABLE 문 사용하여 명시 적으로 지정되어있는 최대치를 넘는 모든 값을 포함합니다.

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
    PARTITION p0 VALUES LESS THAN (6),
    PARTITION p1 VALUES LESS THAN (11),
    PARTITION p2 VALUES LESS THAN (16),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);
참고

일치하는 값을 찾을 수 없을 때 오류를 방지 할 수있는 다른 방법은 INSERT 문의 일부로 IGNORE 키워드를 사용하는 것입니다. 예를 들어, 섹션 19.2.2 "LIST 파티셔닝" 를 참조하십시오. 또한 IGNORE 일반적인 정보는 섹션 13.2.5 "INSERT 구문" 을 참조하십시오.

MAXVALUE 는 가능한 최대 정수 값보다 확실히 큰 정수 값을 나타냅니다 (수학 용어로는 최대입니다). 따라서 store_id 컬럼 값이 16 (정의 된 최대 값) 이상인 행은 파티션 p3 에 저장됩니다. 미래의 어떤 시점에서 점포 수가 25,30 또는 그 이상으로 증가한 경우, ALTER TABLE 문을 사용하여 점포 21-25,26-30 등을위한 새로운 파티션을 추가 할 수 있습니다 ( 이렇게하는 방법에 대한 자세한 내용은 섹션 19.3 "파티션 관리" 를 참조하십시오).

마찬가지로 직원 채용 코드에 따라 (즉, job_code 컬럼 값의 범위에 따라) 테이블을 분할 할 수 있습니다. 예를 들어, 정규 (매장) 직원 2 자리 작업 코드, 사무실 및 지원 직원에 3 자리 코드 및 관리직에 4 자리 코드가 사용된다고 가정하면 다음 명령문을 사용하여 분할 된 테이블을 만들 수 있습니다.

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
)
PARTITION BY RANGE (job_code) (
    PARTITION p0 VALUES LESS THAN (100),
    PARTITION p1 VALUES LESS THAN (1000),
    PARTITION p2 VALUES LESS THAN (10000)
);

이 예제에서는 매장 직원에 관련된 모든 행은 파티션 p0 , 사무실 및 지원 직원에 대한 것은 p1 및 관리직에 관련된 것은 파티션 p2 에 저장됩니다.

VALUES LESS THAN 절에 표현식을 사용할 수도 있습니다. 그러나 MySQL이 수식의 반환 값을 LESS THAN ( < ) 비교의 일부로 평가 수 있어야합니다.

점포 번호에 따라 테이블 데이터를 분할하는 것이 아니라 대신 2 개의 DATE 컬럼 중 하나를 기반으로 식을 사용할 수 있습니다. 예를 들어, 각 직원이 회사를 퇴직 년도 (즉, YEAR(separated) 의 값)에 따라 분할한다고합니다. 그런 파티셔닝 구성표를 구현하는 CREATE TABLE 문 예를 보여줍니다.

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY RANGE ( YEAR(separated) ) (
    PARTITION p0 VALUES LESS THAN (1991),
    PARTITION p1 VALUES LESS THAN (1996),
    PARTITION p2 VALUES LESS THAN (2001),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);

이 제도는 1991 년 이전에 퇴직 한 모든 직원의 경우 행은 파티션 p0 에 저장됩니다. 1991 년부터 1995 년까지 퇴직 한 사람은 p1 1996 년부터 2000 년까지 퇴직 한 사람은 p2 및 2000 년 이후 퇴직 한 직원은 p3 에 저장됩니다.

다음의 예와 같이, UNIX_TIMESTAMP() 함수를 사용하여 TIMESTAMP 컬럼의 값에 따라 RANGE 에 의해 테이블을 분할 할 수 있습니다.

CREATE TABLE quarterly_report_status (
    report_id INT NOT NULL,
    report_status VARCHAR(20) NOT NULL,
    report_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PARTITION BY RANGE ( UNIX_TIMESTAMP(report_updated) ) (
    PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-01 00:00:00') ),
    PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-04-01 00:00:00') ),
    PARTITION p2 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-07-01 00:00:00') ),
    PARTITION p3 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-10-01 00:00:00') ),
    PARTITION p4 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-01-01 00:00:00') ),
    PARTITION p5 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-04-01 00:00:00') ),
    PARTITION p6 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-07-01 00:00:00') ),
    PARTITION p7 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-10-01 00:00:00') ),
    PARTITION p8 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-01-01 00:00:00') ),
    PARTITION p9 VALUES LESS THAN (MAXVALUE)
);

TIMESTAMP 값을 포함한 다른 식은 허용되지 않습니다 (Bug # 42849를 참조하십시오).

다음 조건 중 하나 이상이 true의 경우, RANGE 파티셔닝이 특히 유용합니다.

  • "오래된"데이터를 삭제하고자하거나 할 필요가있다. 직전의 파티셔닝 구성표를 사용하는 경우, 단순히 ALTER TABLE employees DROP PARTITION p0; 를 사용하여 1991 년 이전에 회사를 퇴직 한 직원에 대한 모든 행을 삭제할 수 있습니다. (자세한 내용은 섹션 13.1.7 "ALTER TABLE 구문」 및 섹션 19.3 "파티션 관리" 를 참조하십시오). 테이블에 많은 행이있는 경우, 이것은 DELETE FROM employees WHERE YEAR(separated) <= 1990; 등의 DELETE 쿼리를 실행하는 것보다 훨씬 효율적인 경우가 있습니다.

  • 날짜 또는 시간 값 또는 어떤 다른 일련 값으로 인한 값이 포함 된 컬럼을 사용하고 싶습니다.

  • 테이블 파티셔닝에 사용되는 컬럼에 직접 의존하는 쿼리를 자주 수행한다. 예를 들어, EXPLAIN PARTITIONS SELECT COUNT(*) FROM employees WHERE separated BETWEEN '2000-01-01' AND '2000-12-31' GROUP BY store_id; 같은 쿼리를 실행하는 경우 MySQL은 파티션 p2 만 검사해야 이다 금방 파악할 수 있습니다 (나머지 파티션에 WHERE 절을 충족 레코드가 포함 된 리가 없기 때문에). 이것이 어떻게 실현되는지에 대한 자세한 내용은 19.4 절 "파티션 가지 치기" 를 참조하십시오.

이 유형의 파티셔닝의 변형이 RANGE COLUMNS 파티셔닝입니다. RANGE COLUMNS 자동 파티션은 여러 컬럼을 사용하여 분할 범위를 정의 할 수 있습니다 (파티션 내에서 행의 배치 및 파티션 가지 치기를 실행할 때 특정 파티션의 포함 또는 제외를 판단 할 때 적용됩니다). 자세한 내용은 섹션 19.2.3.1 "RANGE COLUMNS 파티셔닝" 를 참조하십시오.

시간 간격에 따른 파티셔닝 구성표 MySQL 5.6 시간의 범위 또는 거리에 따라 파티셔닝 구성표를 구현하려면 두 가지 방법이 있습니다.

  1. 다음과 같이 RANGE 에 따라 테이블을 분할하고 분할 식에 DATE , TIME 또는 DATETIME 컬럼을 조작하여 정수 값을 반환하는 함수를 사용합니다.

    CREATE TABLE members (
        firstname VARCHAR(25) NOT NULL,
        lastname VARCHAR(25) NOT NULL,
        username VARCHAR(16) NOT NULL,
        email VARCHAR(35),
        joined DATE NOT NULL
    )
    PARTITION BY RANGE( YEAR(joined) ) (
        PARTITION p0 VALUES LESS THAN (1960),
        PARTITION p1 VALUES LESS THAN (1970),
        PARTITION p2 VALUES LESS THAN (1980),
        PARTITION p3 VALUES LESS THAN (1990),
        PARTITION p4 VALUES LESS THAN MAXVALUE
    );
    

    MySQL 5.6에서는 다음 예제와 같이 UNIX_TIMESTAMP() 함수를 사용하여 TIMESTAMP 컬럼의 값에 따라 RANGE 에 의해 테이블을 분할 할 수 있습니다.

    CREATE TABLE quarterly_report_status (
        report_id INT NOT NULL,
        report_status VARCHAR(20) NOT NULL,
        report_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    )
    PARTITION BY RANGE ( UNIX_TIMESTAMP(report_updated) ) (
        PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-01 00:00:00') ),
        PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-04-01 00:00:00') ),
        PARTITION p2 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-07-01 00:00:00') ),
        PARTITION p3 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-10-01 00:00:00') ),
        PARTITION p4 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-01-01 00:00:00') ),
        PARTITION p5 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-04-01 00:00:00') ),
        PARTITION p6 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-07-01 00:00:00') ),
        PARTITION p7 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-10-01 00:00:00') ),
        PARTITION p8 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-01-01 00:00:00') ),
        PARTITION p9 VALUES LESS THAN (MAXVALUE)
    );
    

    MySQL 5.6에서는 TIMESTAMP 값을 포함한 다른 식은 허용되지 않습니다. (Bug # 42849를 참조하십시오).

    참고

    MySQL 5.6에서는 LIST 로 파티션 된 테이블의 파티셔닝 식으로 UNIX_TIMESTAMP(timestamp_column) 를 사용할 수도 있습니다. 그러나 이렇게하는 것은 일반적으로 실용적이지 않습니다.

  2. DATE 또는 DATETIME 컬럼을 파티셔닝 컬럼으로 사용하여 RANGE COLUMNS 따라 테이블을 분할합니다. 예를 들어, 다음과 같이 joined 컬럼을 직접 사용하여 members 테이블을 정의 할 수 있습니다.

    CREATE TABLE members (
        firstname VARCHAR(25) NOT NULL,
        lastname VARCHAR(25) NOT NULL,
        username VARCHAR(16) NOT NULL,
        email VARCHAR(35),
        joined DATE NOT NULL
    )
    PARTITION BY RANGE COLUMNS(joined) (
        PARTITION p0 VALUES LESS THAN ('1960-01-01'),
        PARTITION p1 VALUES LESS THAN ('1970-01-01'),
        PARTITION p2 VALUES LESS THAN ('1980-01-01'),
        PARTITION p3 VALUES LESS THAN ('1990-01-01'),
        PARTITION p4 VALUES LESS THAN MAXVALUE
    );
    
참고

DATE 또는 DATETIME 이외의 날짜 또는 시간 형식을 사용하여 파티셔닝 컬럼을 사용하는 것은 RANGE COLUMNS 에서 지원되지 않습니다.


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