19.2.2 LIST 파티셔닝
MySQL의 LIST 파티셔닝은 많은 점에서 RANGE 파티셔닝과 비슷합니다. RANGE
자동 파티션과 마찬가지로 각 파티션을 명시 적으로 정의해야합니다. 두 가지 유형의 파티셔닝의 주요 차이점은 LIST 파티셔닝에서는 각 파티션이 연속 값의 범위 세트 중 하나가 아닌 값 목록의 세트 중 하나에 포함 된 컬럼 값의 구성원에 따라 정의 및 선택되는 것입니다. 이렇게하려면 PARTITION BY LIST (
를 사용합니다. 여기서 expr
)expr
는 컬럼 값 또는 컬럼 값을 기준 식에서 정수 값을 반환 VALUES IN (
에서 각 파티션을 정의합니다. 여기에서 value_list
)value_list
는 쉼표로 구분 된 정수 목록입니다.
MySQL 5.6에서는 LIST
로 파티션 할 때 정수 (및 NULL
도 가능. 섹션 19.2.7 "MySQL 파티셔닝에 의한 NULL 처리" 를 참조하십시오) 목록에 대해서만 일치시킬 수 있습니다.
그러나 LIST COLUMN
파티셔닝을 사용하면 다른 컬럼 타입을 값 목록에서 사용할 수 있습니다 (이 내용은이 섹션에서 설명합니다).
범위에서 정의되는 파티션의 경우와 달리, 목록 파티션은 특정 순서로 선언 할 필요가 없습니다. 구문에 대한 자세한 내용은 섹션 13.1.17 "CREATE TABLE 구문" 을 참조하십시오.
다음 예에서는 분할 테이블의 기본 정의는 다음 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 );
(이것은 섹션 19.2.1 "RANGE 파티셔닝" 예 출발점으로 사용한 것과 같은 테이블입니다.)
다음 표와 같이 20 비디오 가게가 있고 그들이 4 개의 프랜차이즈로 분류되어 있다고 가정합니다.
Region | Store ID Numbers |
---|---|
North | 3, 5, 6, 9, 17 |
East | 1, 2, 10, 11, 19, 20 |
West | 4, 12, 13, 14, 18 |
Central | 7, 8, 15, 16 |
같은 지역에 속하는 점포 행이 동일한 파티션에 저장되도록이 테이블을 분할하려면 다음과 같은 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 LIST(store_id) ( PARTITION pNorth VALUES IN (3,5,6,9,17), PARTITION pEast VALUES IN (1,2,10,11,19,20), PARTITION pWest VALUES IN (4,12,13,14,18), PARTITION pCentral VALUES IN (7,8,15,16) );
이는 특정 지역에 대한 직원 레코드를 테이블에 쉽게 추가 또는 제거 할 수 있습니다. 예를 들어, 서부 지역의 전체 점포가 다른 회사에 매각되었다고합니다. MySQL 5.6에서는 그 지역의 매장에서 일하던 직원에 관련된 모든 행을 쿼리 ALTER TABLE employees TRUNCATE PARTITION pWest
를 사용하여 삭제할 수 있습니다. 이것은 동등한 DELETE
문 DELETE FROM employees WHERE store_id IN (4,12,13,14,18);
보다 훨씬 효율적으로 수행 할 수 있습니다 ( ALTER TABLE employees DROP PARTITION pWest
를 사용해도 이러한 모든 행이 삭제되지만 테이블 정의에서 파티션 pWest
도 삭제되므로 ALTER TABLE ... ADD PARTITION
문을 사용하여 테이블의 원래 파티셔닝 구성표를 복원해야합니다).
RANGE
파티셔닝과 마찬가지로, LIST
파티셔닝과 해시 또는 키를 사용하여 파티션을 결합하여 복합 파티셔닝 (서브 파티션)을 생성 할 수 있습니다. 섹션 19.2.6 "서브 파티셔닝" 를 참조하십시오.
RANGE
파티셔닝의 경우와 달리, MAXVALUE
등의 "모든 상황에 대응하는"것은 아닙니다. 분할 식으로 예상되는 모든 값을 PARTITION ... VALUES IN (...)
절에 지정하십시오. 일치하지 않는 파티셔닝 컬럼 값이 포함되어있는 INSERT
문은 다음 예제와 같이 오류로 실패합니다.
mysql>CREATE TABLE h2 (
->c1 INT,
->c2 INT
->)
->PARTITION BY LIST(c1) (
->PARTITION p0 VALUES IN (1, 4, 7),
->PARTITION p1 VALUES IN (2, 5, 8)
->);
Query OK, 0 rows affected (0.11 sec) mysql>INSERT INTO h2 VALUES (3, 5);
ERROR 1525 (HY000): Table has no partition for value 3
단일 INSERT
문을 사용하여 여러 행을 삽입 할 때의 동작은 테이블이 트랜잭션 스토리지 엔진을 사용할지 여부에 따라 다릅니다. InnoDB
테이블의 경우 문은 단일 트랜잭션으로 간주되고 일치하지 않는 값이있을 때 문이 완전히 실패하고 행은 삽입되지 않습니다. MyISAM
과 같은 비 트랜잭션 스토리지 엔진을 사용하는 테이블의 경우 일치하지 않는 값이 포함 된 행 앞에있는 행은 삽입되지만, 나머지의 행은되지 않습니다.
이 유형의 오류는 IGNORE
키워드를 사용하여 무시 될 수 있습니다. 그러한 경우 일치하지 않는 파티셔닝 컬럼 값이 포함 된 행은 삽입되지 않지만 일치하는 값을 가진 행이 삽입되어 오류가보고되지 않습니다.
mysql>TRUNCATE h2;
Query OK, 1 row affected (0.00 sec) mysql>SELECT * FROM h2;
Empty set (0.00 sec) mysql>INSERT IGNORE INTO h2 VALUES (2, 5), (6, 10), (7, 5), (3, 1), (1, 9);
Query OK, 3 rows affected (0.00 sec) Records: 5 Duplicates: 2 Warnings: 0 mysql>SELECT * FROM h2;
+------+------+ | c1 | c2 | +------+------+ | 7 | 5 | | 1 | 9 | | 2 | 5 | +------+------+ 3 rows in set (0.00 sec)
MySQL 5.6는 LIST COLUMNS
파티셔닝 지원을 제공합니다. 이것은 LIST
파티셔닝의 변형에서 파티셔닝 컬럼에 정수 이외의 형태의 컬럼을 사용하거나 여러 컬럼을 파티셔닝 키로 사용 할 수 있습니다. 자세한 내용은 섹션 19.2.3.2 "LIST COLUMNS 파티셔닝" 를 참조하십시오.