分区表就是按照某种规则将同一张表的数据分段划分到多个位置存储。对数据的分区存储提高了数据库的性能,被分区存储的数据在物理上是多个文件,但在逻辑上仍然是一个表,对表的任何操作都跟没分区之前一样。在执行增、删、改、查操作时,数据库会自动找到对应的分区,然后执行操作。
mysql从5.1.3开始支持分区
分区表的好处:存储更多、便于管理、提升查询效率、并行处理、提高查询吞吐
分区表中的四种类型
mysql支持的分区类型包括Range、List、Hash和Key,其中Range最常用。
Range分区:允许将数据划分为不同范围。例如可以将一个表通过年份划分成若干个分区。
List分区:允许系统通过预定义的列表的值来对数据进行分割。
Hash分区:允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。
Key分区:对Hash模式的一种延伸,这里的Hash Key是mysql系统产生的。
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) #主键必须包含分区字段
)default charset=utf8
#将表按照年龄范围进行分区
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'
);
#插入数据
insert into user_range(name,age,province) values('张三',18,1);
insert into user_range(name,age,province) values('李四',30,1);
List分区
List分区是基于列值匹配一个离散值集合中的某个值来进行选择。
示例
creat table user_range(
id int not null auto_increment,
name varchar(30),
age int,
birthday date,
province int,
primary key(id,province) #主键必须包含分区字段
)
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)
);
分区的其它操作
新增分区
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 (20) data directory = 'c:/data/p2',
partition p3 values less than (20) data directory = 'c:/data/p3',
partition p4 values less than (20) data directory = 'c:/data/p4'
);
删除分区(分区下的数据也会被删除)
alter table 'user' drop partition p5;
移除分区(数据不会被删除)
alter table 'user' remove partitioning;