MySQL支持数据分区,能够在对用户无感知的状况下,将对表数据的物理文件进行分区。算法
MySQL的分区支持Memory、MyISAM、InnoDB等存储引擎。sql
注意:MySQL中若是存在主键,或者惟一索引,那么分区字段必须包含这些字段。函数
一、分区后的文件能够存储在不一样的分区,提升MySQL存储量spa
二、根据查询条件能够有选择之扫描某个分区,使用sum等聚合函数的时候能够并行检索全部分区。日志
三、经过必定规则的分区,能够快速删除分区内的数据,好比存储日志按月分区能够快速删除历史日志。code
四、经过将分区保存在不一样的硬盘之上,来提高系统的IO吞吐量。索引
检查MySQL版本是否支持分区ci
//查看表分区状态 查看 have_parttition_engine 是否为YES SHOW VARIABLES LIKE '%parttition%';
检测SQL查询扫描了哪一个分区hash
//检查SQL语句使用了哪一个分区分区 explain partitions SQL;
目前MySQL支持 range、list、columns、hash、key等几种分区方式。it
Range方式的分区,能够选择指定字段根据连续的区间进行分区,好比:
小于20的分区为 p0,20-40的叫作p1 40-60的叫作p2,大于60的叫作p3,在MySQL中的表示为:
注意:Range方式定义每个分区区间,好比按从小到大的顺序来定义。
PARTITION BY RANGE(sum) ( PARTITION p0 VALUES LESS THAN (20), PARTITION p1 VALUES LESS THAN (40), PARTITION p2 VALUES LESS THAN (60), PARTITION p3 VALUES LESS THAN MAXVALUE )
其中 sum 字段能够进行表达式运算。好比加入上面分区key为create time能够经过YEAR(createtime)来进行运算。
LIST方式的分区,跟Range方式相似,不一样的是,LIST方式非连续区间,而是一个枚举列表的集合。
只有存在于这个枚举列表集合内的数据才能够被插入,不然不能够写入。
PARTITION BY LIST(type) ( PARTITION p0 VALUES IN (1,2,3), PARTITION p1 VALUES IN (4,5,6), PARTITION p2 VALUES IN (7,8,9) )
Columns方式算是对Range和LIST方式的一个补充,由于Range和LIST仅仅支持整数字段分区,因此经过Columns方式能够实现非整数分区,目前支持如下类型:整型、date、datetime、char、varchar、binary、varbinary等类型。
Columns方式不能够在定义分区key的时候进行表达式运算,可是能够定义多个分区key。
PARTITION BY RANGE COLUMNS(sum, avg) ( PARTITION p0 VALUES LESS THAN (20, 5), PARTITION p1 VALUES LESS THAN (40, 10), PARTITION p2 VALUES LESS THAN (60, 15), PARTITION p3 VALUES LESS THAN MAXVALUE )
经过对分区key表达式取模的方式,对数据进行均匀的分区。
//id进行hash运算后分红4个分区 PARTITION BY HASH(id) PARTITIONS 4;
可是这种方式太不灵活了,扩展性很是差,不利于之后分区的扩展,因此MySQL提供另一种线形Hash。
PARTITION BY LINEAR HASH(id) PARTTITIONS 8;
经过线形hash分区后的数据,在扩容的时候若是分区数为2的N次幂,那么计算的结果于普通hash相同,这样避免了往后扩容的数据迁移,可是也致使数据不均的问题。
于Hash分区很相似,区别在于只支持数字,而且定义分区字段的时候不容许使用表达式,可是能够提供多个分区字段。
另外Hash分区采用MOD的方式进行计算,Key分区采用MySQL内部的Hash算法进行计算。
Key分区在存在主键或惟一索引时候能够不指定分区字段,不指定的状况会默认使用主键或惟一索引。
//根据id进行分区,并划分四个分区 PARTITION BY KEY(id) PARTITIONS 4;
MySQL容许对Range和List分区后的每一个分区再次进行Hash或Key分区操做。
PARTITION BY LIST(type) SUBPARTITION BY KEY(id) SUBPARTTIONS 4 ( ... )
分区方式 | 处理方式 |
---|---|
Hash | 做为0值 |
Key | 做为0值 |
Range | 做为最小值 |
List | 必须包含在枚举列表 |
//删除某个分区 ALTER TABLE `表名` DROP PARTITION `分区名`; //增长分区 ALTER TABLE `表名` ADD PARTITION (PARTITION p0 VALUES LESS THAN (10)); //修改分区 并自动迁移数据 ALTER TABLE `表名` REORGANIZE PARTITION INTO `一个或分区名`(更新后的分区)
Range修改分区的时候,修改多个分区必须为连续的分区不能够跳跃的修改。
List分区修改或增长的时候,不容许插入枚举列表中已经存在的值。
Hash和Key两种分区类型不容许直接删除某个分区,可是能够将分区进行合并。
//修改分区个数为2 并合并数据 ALTER TABLE `表名` COALESCE PARTITION PARTITION 2;
COALESCE只能够减小分区个数不能够增长分区个数。
//增长分区个数 增长6个分区 ALTER TABLE `表名` ADD PARTITION PARTITIONS 6;
能够经过以上方式,增长指定数量的分区。