LIST 파티셔닝과 RANGE 파티셔닝은 매우 유사합니다. 주요 차이점은 LIST는 열거형 값 목록의 모음이고 RANGE는 연속적인 간격 값의 모음이라는 것입니다. 둘은 구문이 매우 유사합니다. 또한 LIST 파티션 열은 Null이 아닌 열인 것이 좋습니다. 그렇지 않으면 열거 목록에 Null 값이 없으면 Null 값을 삽입할 수 없습니다. 이는 다른 파티션과 다릅니다. HASHKEY는 0으로 나누어 저장됩니다. 기본 LIST 파티션은 정수 필드만 지원하며, 정수가 아닌 필드는 함수를 통해 정수 필드로 변환해야 합니다. 함수 변환 없이 정수가 아닌 필드를 지원하는 파티션은 COLUMN 파티션에 자세히 설명되어 있습니다.
1. 파티션 생성
List에 있는 각 파티션의 열거된 값은 서로 다르기만 하면 되며 정해진 순서는 없습니다.
CREATE TABLE tblist ( id INT NOT NULL, store_id INT ) PARTITION BY LIST(store_id) ( PARTITION a VALUES IN (1,5,6), PARTITION b VALUES IN (2,7,8), PARTITION c VALUES IN (3,9,10), PARTITION d VALUES IN (4,11,12) );
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='tblist';
1. 데이터 삽입
insert into tblist(id,store_id) values(1,1),(7,7);
두 개의 파티션 a와 b에 각각 레코드를 삽입합니다
2. 목록에 없는 값을 삽입할 때
목록에 없는 값을 삽입할 때 열거 목록을 파티션에 삽입하면 삽입이 실패하며, 열거 목록에 null 값이 없으면 삽입도 실패합니다
2. 파티션 관리
1. 파티션을 추가합니다.
ALTER TABLE tblist ADD PARTITION (PARTITION e VALUES IN (20));
참고: 기존 값이 포함된 파티션을 추가할 수 없습니다.
2. 파티션 병합
ALTER TABLE tblist REORGANIZE PARTITION a,b INTO (PARTITION m VALUES IN (1,5,6,2,7,8));
파티션 a와 b를 파티션 m으로 병합
참고: RANGE 파티션과 마찬가지로 여러 개의 인접한 파티션만 병합할 수 있습니다. 파티션 간에 병합되었습니다. 예를 들어, 두 개의 파티션 a와 c를 병합할 수 없습니다.
3.파티션을 분할합니다
ALTER TABLE tblist REORGANIZE PARTITION a,b,c INTO (PARTITION n VALUES IN (1,5,6,3,9,10), PARTITION m VALUES IN (2,7,8)); ALTER TABLE tblist REORGANIZE PARTITION n INTO ( PARTITION a VALUES IN (1,5,6), PARTITION b VALUES IN (3,9,10));
.
두 번의 분할 후에 열거 목록(3,9,10)이 (2,7,8) 앞에 순위가 매겨졌습니다. 실제로는 이렇습니다. , abc는 n의 열거 값이 m보다 작기 때문에 n 파티션이 m 파티션 앞에 분할되므로 분할 파티션도 m 파티션 앞에 위치합니다. 파티션 a는 b 파티션의 값보다 값이 작으므로 a가 b보다 앞에 랭크됩니다.
참고: 1. 버전 5.7.12에서 테스트한 결과 파티션을 병합하고 분할하여 재정의된 열거 값이 원래 값이 아닐 수 있으며 새로 병합되거나 분할된 경우, 파티션 열거 값에 원래 열거 값이 포함되어 있지 않아 데이터가 손실됩니다. mysql이 이 동작을 금지하지 않는 이유는 모르겠지만, 파티션의 열거 값이 병합이든 분할이든 변경되지 않고 유지되거나 증가만 할 수만 있고 감소할 수는 없도록 인위적으로 요구됩니다. 손실되지 않습니다.
2. 병합 및 분할된 파티션은 인접한 파티션이므로 원래 파티션의 값에 따라 새 파티션이 병합 및 분할되며 새 파티션도 원래 파티션의 순서 위치에 있게 됩니다. .
4. 파티션 삭제
ALTER TABLE tblist DROP PARTITION e;
참고: 파티션을 삭제하면 파티션의 데이터도 삭제되며, 열거된 목록 값도 삭제됩니다. 나중에 테이블.
3. 기타 파티션
시간 필드 분할
CREATE TABLE listdate ( id INT NOT NULL, hired DATETIME NOT NULL ) PARTITION BY LIST( YEAR(hired) ) ( PARTITION a VALUES IN (1990), PARTITION b VALUES IN (1991), PARTITION c VALUES IN (1992), PARTITION d VALUES IN (1993) ); ALTER TABLE listdate ADD INDEX ix_hired(hired); INSERT INTO listdate() VALUES(1,'1990-01-01 10:00:00'),(1,'1991-01-01 10:00:00'),(1,'1992-01-01 10:00:00');
EXPLAIN SELECT * FROM listdate WHERE hired='1990-01-01 10:00:00';
LIST 파티셔닝은 정수가 아닌 시간 유형 필드의 변환 파티셔닝도 지원합니다.
4. 테이블 파티션 제거
ALTER TABLE tablename REMOVE PARTITIONING ;
참고: 제거를 사용하여 파티션을 제거하면 파티션 정의만 제거되고 데이터는 삭제되지 않습니다. 후자 데이터와 함께 삭제됩니다