예전에는 칸막이를 보고 꼬집어보니 너무 높았어요. 어제 드디어 분할이 무엇인지 배웠습니다만, 오늘 정리하자면 좋은 기억력은 나쁜 글쓰기만큼 좋지 않습니다.
MySQL은 5.1부터 파티셔닝 기능을 지원합니다. 파티셔닝에 대한 한 문장은 다음과 같습니다. 把一张表按照某种规则(range/list/hash/key等)分成多个区域(页/文件)保存。
MySQL 애플리케이션 개발의 경우 파티셔닝과 비파티셔닝 간에 차이가 없습니다(즉, 애플리케이션에 투명합니다). 이는 돌파 전투에서 "조각으로 나누는" 것과 같습니다. MySQL은 파티션 생성을 위해 대부분의 스토리지 엔진(예: MyISAM, InnoDB, Memory 등)을 지원하지만 파티션 생성을 위한 MERGE 및 CSV는 지원하지 않습니다. 동일한 파티션 테이블의 모든 파티션은 동일한 스토리지 엔진이어야 합니다. 예를 들어보세요:
#创建一个5个hash分区的myisam表 CREATE TABLE `test`.`partition_t1`( `id` INT UNSIGNED NOT NULL, `username` VARCHAR(30) NOT NULL, `email` VARCHAR(30) NOT NULL, `birth_date` DATE NOT NULL ) ENGINE=MYISAM PARTITION BY HASH(MONTH(birth_date)) PARTITIONS 5;
더 많은 데이터를 저장할 수 있습니다(시스템의 단일 파일 최대 한도)
where 절에서 쿼리를 최적화합니다. 파티션 조건이 포함된 경우, 쿼리 효율성을 높이려면 하나만 스캔하거나 부분 분할하면 됩니다. sum()과 같은 함수의 경우 파티션에서 병렬로 처리할 수 있으며 최종적으로 결과가 요약됩니다.
만료되었거나 불필요한 데이터의 경우 관련 파티션을 삭제하여 빠르게 데이터를 삭제할 수 있습니다.
데이터 쿼리를 여러 디스크에 분산하여 단일 테이블의 동시성 성능이 향상되고 디스크 I/O 성능도 향상됩니다.
은 4가지 유형으로 구분됩니다.
범위 파티션: 주어진 데이터의 연속적인 간격 범위는 서로 다른 파티션에 할당됩니다.
목록 분할: 범위 분할과 유사하지만, 목록은 열거된 값 목록을 기준으로 분할되고, 범위는 범위를 기준으로 분할된다는 점이 다릅니다.
해시 파티션: 주어진 파티션 수에 따라 데이터를 다른 파티션에 할당합니다(모듈로/선형)
키 파티션: 유사 해시 파티셔닝.
MySQL 5.1의 범위, 목록, 해시 파티셔닝에서 파티션 키는 int여야 합니다. MySQL 5.5 이상에서는 정수가 아닌 범위 및 목록 파티션, 즉 범위 열과 목록 열을 지원합니다.
참고: 어떤 종류의 파티셔닝에 관계없이 파티션 테이블에 기본 키/고유 키가 없거나 파티션 키 중 하나가 기본 키/고유 키여야 합니다.
범위 파티셔닝은 값 범위(간격)를 사용하여 파티션을 나누는 간격이 연속적이어야 하며 서로 겹칠 수 없습니다. . values less than
연산자를 사용하여 파티션 정의를 수행합니다.
예제 1:
CREATE TABLE `test`.`partition_t2`( `id` INT UNSIGNED NOT NULL, `username` VARCHAR(30) NOT NULL, `email` VARCHAR(30) NOT NULL, `birth_date` DATE NOT NULL ) ENGINE=MYISAM PARTITION BY RANGE(id)( PARTITION t21 VALUES LESS THAN (10), PARTITION t22 VALUES LESS THAN (20), PARTITION t23 VALUES LESS THAN MAXVALUE );
위의 예에서는 3개의 파티션(t21, t22, t23)을 포함하는 범위 파티션 테이블이 정의되어 있습니다. 고급 언어의 <a href="http://www.php.cn/code/5745.html" target="_blank">switch 문 <code>这个有点类似与高级语言中的<a href="http://www.php.cn/code/5745.html" target="_blank">switch语句</a>
과 유사합니다. 설명은 다음과 같습니다: id<10이면 t21 파티션에 있고, 20>id>=10이면 t22 파티션에 있고, id>=20이면 t23 파티션에 있습니다.
예 2:
CREATE TABLE `test`.`partition_t3`( `id` INT UNSIGNED NOT NULL, `username` VARCHAR(30) NOT NULL, `email` VARCHAR(30) NOT NULL, `birth_date` DATE NOT NULL ) ENGINE=MYISAM PARTITION BY RANGE COLUMNS(birth_date)( PARTITION t31 VALUES LESS THAN ('1996-01-01'), PARTITION t32 VALUES LESS THAN ('2006-01-01'), PARTITION t33 VALUES LESS THAN ('2038-01-01') );
MySQL5.5는 범위 분할을 개선하고 정수가 아닌 분할을 지원하는 범위 열 분할을 제공합니다.
list 파티션은 개별 값 목록을 생성합니다(mysql의 열거형 데이터와 유사). 파티션을 나누고, values in
연산자를 사용합니다. 분할하려면 . 목록 파티션은 특정 순서로 선언할 필요가 없습니다. 목록은 여러 면에서 범위와 유사합니다.
CREATE TABLE `test`.`partition_t4`( `id` INT UNSIGNED NOT NULL, `username` VARCHAR(30) NOT NULL, `email` VARCHAR(30) NOT NULL, `birth_date` DATE NOT NULL ) ENGINE=MYISAM PARTITION BY LIST(id)( PARTITION t41 VALUES IN (1,2), PARTITION t42 VALUES IN (3,6), PARTITION t43 VALUES IN (5,4), PARTITION t44 VALUES IN (7,8) );
위의 예는 id가 1 또는 2이면 t41로 분할되고, id가 3 또는 6이면 t42로 분할되는 식입니다...
해시 파티션은 주로 핫스팟 읽기를 분산시켜 데이터가 미리 정해진 개수의 파티션에 최대한 균등하게 분산되도록 하는 데 사용됩니다. 테이블이 해시 파티셔닝을 수행할 때 MySQL은 파티션 키에 해시 함수를 적용하여 n개의 파티션 중 데이터를 배치할 파티션을 결정합니다. 해시 파티션은 取模算法(默认hash分区方式)
및 线性的2的幂的运算法则(liner hash 分区)
의 두 가지 해시 기능(파티셔닝 방법)을 지원합니다.
#顶部引例就是常规hash分区
mysql에서는 여러 열이 포함된 해시식 사용을 권장하지 않습니다.
기존 해싱은 파티션 관리 비용이 너무 많이 들고 유연한 파티션 요구 사항에는 적합하지 않습니다. 참조: 일관된 해시 알고리즘
기존 해시 파티셔닝의 관리 문제로 인해 모든 mysql은 선형 해시 파티셔닝을 도입합니다.
CREATE TABLE `test`.`partition_t5`( `id` INT UNSIGNED NOT NULL, `username` VARCHAR(30) NOT NULL, `email` VARCHAR(30) NOT NULL, `birth_date` DATE NOT NULL ) ENGINE=MYISAM PARTITION BY LINEAR HASH(id) PARTITIONS 5;
위의 예에서는 5개의 파티션으로 구성된 선형 해시 파티션이 생성됩니다.
선형 해시 파티셔닝의 장점: MySQL은 파티션 유지 관리를 더 빠르게 처리할 수 있습니다.
线性hash分区缺点:分区各个分区之间数据分布不太均衡。
hash分区允许用户自定义的表达式,而key分区不允许使用用户自定义的表达式。
hash分区只支持整数分区,key分区支持除了blob或text类型之外的其他数据类型分区。
与hash分区不同,创建key分区表的时候,可以不指定分区键,默认会选择使用主键/唯一键作为分区键,没有主键/唯一键,必须指定分区键。
CREATE TABLE `test`.`partition_t6`( `id` INT UNSIGNED NOT NULL, `username` VARCHAR(30) NOT NULL, `email` VARCHAR(30) NOT NULL, `birth_date` DATE NOT NULL ) ENGINE=MYISAM PARTITION BY LINEAR KEY(email) PARTITIONS 5;
columns 包括range columns与list columns 支持非整型的分区键。columns分区支持多列分区
。
CREATE TABLE `test`.`partition_t7`( `a` INT UNSIGNED NOT NULL, `b` INT UNSIGNED NOT NULL ) PARTITION BY RANGE COLUMNS(a,b)( PARTITION p0 VALUES LESS THAN (0,10), PARTITION p1 VALUES LESS THAN (10,10), PARTITION p2 VALUES LESS THAN (10,20), PARTITION p3 VALUES LESS THAN (10,35), PARTITION p4 VALUES LESS THAN (10,MAXVALUE), PARTITION p5 VALUES LESS THAN (MAXVALUE,MAXVALUE) );
判断依据:(a<10) or ((1=10) and (10<10))。
子分区是分区表中对每一个分区的再次分割,又被称为复合分区。MySQL从MySQL5.1开始支持对通过range和list的表再进行子分区,子分区即可以hash分区,也可以使用key分区。子分区适合保存非常大量的数据记录。
CREATE TABLE partition_t8(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 );
MySQL5.1提供添加、删除、重定义、合并、拆分分区命令。
#删除分区 alter table partition_t8 drop partition p2; #添加一个分区 alter table partition_t8 add partition( partition p4 values less than (2030) ) #重定义一个分区 alter table partition_t8 reorganize partition p3 into( partition p2 values less than (2005), partition p3 values less than (2015) );
只能从range分区列表最大端增加分区。
增加list分区,不能添加一个包含现有分区值列表中的任意值分区,也就是说对一个固定的分区键值,必须指定并且只能指定一个唯一的分区。
重新定义range分区,只能够重新定义相邻的分区,同时重新定义的分区区间必须和原分区区间覆盖相同的区间。
#减少分区数,(如将分区数减少到2) alter table partition_t8 coalesce partition 2; #增加分区数(如:为分区数增加了8) alter table partiton_t8 add partition partitions 8;
coalesce不能用来增加分区数量。
【相关推荐】
2. MySQL最新手册教程
3. 数据库设计那些事
위 내용은 MySQL의 파티션에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!