一、什么是分区表
-
分区表就是按照某种规则将同一张表的数据分段划分到多个位置存储。
-
对数据的分区存储提高了数据库的性能,被分区存储的数据在物理上是多个文件,但在逻辑上仍然是一个表,对表的任何操作都跟没分区之前一样。在执行增、删、改、查等操作时,数据库会自动找到对应的分区,然后执行操作。
-
MySQL从5.1.3开始支持分区(Partition)
-
在MySQL 8.0中,只有
InnoDB
和NDB
两个存储引擎支持分区。
二、分区表的好处
三、分区表的四种类型
- MySQL支持的分区类型包括
Range
、List
、Hash
和Key
,其中Range最常用
1. Range分区
-
Range分区是基于属于一个给定连续区间的列值,把多行分配给分区
-
示例
#Range分区示例 create table user_range( id int not null auto_increment, name varchar(30) , age int, birthday date, province int, primary key(id, age) #主键必须包含分区字段 )ENGINE=InnoDB; partition by RANGE(age) ( #按年龄进行分区 partition p1 VALUES LESS THAN (20) DATA DIRECTORY = 'c:/data/p1', #0~20 partition p2 VALUES LESS THAN (40) DATA DIRECTORY = 'c:/data/p2', #20~40 partition p3 VALUES LESS THAN (60) DATA DIRECTORY = 'c:/data/p3', #40~60 partition p4 VALUES LESS THAN MAXVALUE DATA DIRECTORY = 'c:/data/p4'#60~max )ENGINE=InnoDB;
- 主键必须包含分区字段
2. List分区
-
List分区是基于列值匹配一个离散值集合中的某个值来进行选择
-
示例
#List分区示例 create table user_list( id int not null auto_increment, name varchar(30) , age int, birthday date, province int, primary key(id, province) )ENGINE=InnoDB; partition by List(province) ( partition p1 VALUES IN (1,3,5,7,9,11,13,15,17,19,21), # 匹配离散值集合 partition p2 VALUES IN (2,4,6,8,10,12,14,16,18,20,22), partition p3 VALUES IN (23,24,25,26,27,28,29,30,31,32,33,34) );
3. Hash分区
-
Hash分区是基于用户定义的表达式的返回值来进行选择的分区。
#Hash分区示例 create table user_hash( id int not null auto_increment, name varchar(30) , age int, birthday date, province int, primary key(id, birthday) )ENGINE=InnoDB; partition by HASH(YEAR(birthday)) partitions 5;
4. Key分区
-
Key分区类似于Hash分区,但这里的Hash Key是由MySQL系统产生的
#Key分区示例 create table user_key( id int not null auto_increment, name varchar(30) , age int, birthday date, province int, primary key(id, age) )ENGINE=InnoDB; partition by KEY (age) partitions 5;
四、分区的其他操作
-
range
分区的操作#新增分区 alter table `user` add partition(partition p5 VALUES LESS THAN MAXVALUE); #对已存在的表进行分区 alter table `user` partition by RANGE(age) ( partition p1 VALUES LESS THAN (20) DATA DIRECTORY = 'c:/data/p1', partition p2 VALUES LESS THAN (40) DATA DIRECTORY = 'c:/data/p2', partition p3 VALUES LESS THAN (60) DATA DIRECTORY = 'c:/data/p3', partition p4 VALUES LESS THAN MAXVALUE DATA DIRECTORY = 'c:/data/p4' ); #删除分区(分区下的数据也会被删除) alter table `user` drop partition p5; #移除分区(数据不会被删除) ALTER TABLE `user` REMOVE PARTITIONING;
-
分区点类似索引,如果查询的时候查用于分区的字段,则只在指定分区中查找;否则要进行全表扫描
-
数据量到达百万、千万级的时候,考虑用分区进行优化