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 시간의 범위 또는 거리에 따라 파티셔닝 구성표를 구현하려면 두 가지 방법이 있습니다.
다음과 같이
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)
를 사용할 수도 있습니다. 그러나 이렇게하는 것은 일반적으로 실용적이지 않습니다.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
에서 지원되지 않습니다.