1,表分区简介
1.1 什么是表分区
就是将一个表按照条件分割成若干个小表(并不是物理表,而是一个分区,每个分区对应一个文件),将表从一个大的数据文件分成了若干个小的数据文件;mysql5.1后支持分区
1.2 为什么要分区
这就很简单了,提高查询速度的目的较多。还有方便管理,提高最大存储量,提高吞吐量等
2,分区类型
2.1 基本分区类型
Range分区:最为常用,基于属于一个给定连续区间的列值,把多行分配给分区。最常见的是基于时间字段. 基于分区的列最好是整型,如果日期型的可以使用函数转换为整型。其实就是根据表的一个字段来进行分区,比如说根据年龄段来进行分区。
create table t1 (id int,age int,name varcher(20),pos_date datetime)
pratition by range(age)
(
pratition p01 values less than (10),
pratition p01 values less than (20),
pratition p01 values less than (30),
pratition p01 values less than (maxvalues)
);
List分区:LIST分区和RANGE分区类似,区别在于LIST是枚举值列表的集合,RANGE是连续的区间值的集合。其实真的是和range类似,range是根据范围来分,list可以更具体一些,比如说根据生肖来分区(年龄是离散的)。
create table t1 (id int,cidint,name varcher(20),pos_date datetime)
pratition by list(cid)
(
pratition p01 values less than (1,4,7),
pratition p01 values less than (2,5,8),
pratition p01 values less than (3,6,9),
);
Hash分区:基于给定的分区个数,将数据分配到不同的分区,HASH分区只能针对整数进行HASH,对于非整形的字段只能通过表达式将其转换成整数。
create table t3 (id int,age int,name varcher(20),pos_date datetime)
pratition by hash(cid)
pratitions 4;
线性哈希:使用一个线性2的幂;有利于存储大量数据,增删合拆更快,但是分布不均匀。
语法:同上hash前面加linear
KEY分区和HASH分区的算法不一样,PARTITION BY HASH (expr),MOD取值的对象是expr返回的值,而PARTITION BY KEY (column_list),基于的是列的MD5值。
create table t3 (id int,age int,name varcher(20),pos_date datetime)
pratition by key(cid)
pratitions 4;
多列分区: 就是允许通过多个列来定义一个分区
create table t1 (a int,b int,c int)
pratition by range columns(a ,b)
(
pratition p01 values less than (10,10),
pratition p01 values less than (10,20),
pratition p01 values less than (10,30),
pratition p01 values less than (10,maxvalues)
pratition p01 values less than (maxvalues,maxvalues)
);
2.2 子分区
通俗说就是子分区就是在表分区后再进行分区
create table t4 (id int, udate date)
partition by range(year (udate))
subpartition by hash (to_days(udate))
subpartitions 2
(
partition p01 values less than(1990),
partition p01 values less than(20000),
partition p01 values less than(maxvalues)
);
注意:每个分区的子分区数量必须一致
2.3 分区管理
修改分区
alter table t1 partition by range(age)
(
partition p01 values less than(10),
partition p01 values less than(20),
)
删除分区(包括数据)
alter table t1 drop partition p02;
删除分区的数据
alter table t1 truncate partition p01;
新增分区(只能从高端上加)
alter table access_log add partition(
partition p4 values less than (to_days('20190105'))
);
拆分分区
alter table access_log reorganize partition p4 into(
-> partition s0 values less than(to_days('20190104')),
-> partition s1 values less than(to_days('20190105'))
-> );
合并分区
alter table access_log reorganize partition s0,s1 into (
partition p4 values less than (to_days('20190105'))
);
当分区建立后,分区需持续关心。后续可能出现各种状况,可以进行相应的重建、优化、修复等操作