9、MySQL的分区 - 系统的撸一遍MySQL

MySQL支持数据分区,能够在对用户无感知的状况下,将对表数据的物理文件进行分区。算法

MySQL的分区支持Memory、MyISAM、InnoDB等存储引擎。sql

注意:MySQL中若是存在主键,或者惟一索引,那么分区字段必须包含这些字段。函数

MySQL分区的优势

一、分区后的文件能够存储在不一样的分区,提升MySQL存储量spa

二、根据查询条件能够有选择之扫描某个分区,使用sum等聚合函数的时候能够并行检索全部分区。日志

三、经过必定规则的分区,能够快速删除分区内的数据,好比存储日志按月分区能够快速删除历史日志。code

四、经过将分区保存在不一样的硬盘之上,来提高系统的IO吞吐量。索引

分区相关的命令

检查MySQL版本是否支持分区ci

//查看表分区状态 查看 have_parttition_engine 是否为YES
SHOW VARIABLES LIKE '%parttition%';

检测SQL查询扫描了哪一个分区hash

//检查SQL语句使用了哪一个分区分区
explain partitions SQL;

MySQL的分区方式

目前MySQL支持 range、list、columns、hash、key等几种分区方式。it

Range方式

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方式

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方式

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
)

Hash分区

经过对分区key表达式取模的方式,对数据进行均匀的分区。

//id进行hash运算后分红4个分区
PARTITION BY HASH(id) PARTITIONS 4;

可是这种方式太不灵活了,扩展性很是差,不利于之后分区的扩展,因此MySQL提供另一种线形Hash。

PARTITION BY LINEAR HASH(id) PARTTITIONS 8;

 经过线形hash分区后的数据,在扩容的时候若是分区数为2的N次幂,那么计算的结果于普通hash相同,这样避免了往后扩容的数据迁移,可是也致使数据不均的问题。

Key分区

于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
(
    ...
)

分区字段中的NULL

分区方式 处理方式
Hash 做为0值
Key 做为0值
Range 做为最小值
List 必须包含在枚举列表

分区的管理

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

Hash和Key两种分区类型不容许直接删除某个分区,可是能够将分区进行合并。

//修改分区个数为2 并合并数据
ALTER TABLE `表名` COALESCE PARTITION PARTITION 2;

COALESCE只能够减小分区个数不能够增长分区个数。

//增长分区个数 增长6个分区
ALTER TABLE `表名` ADD PARTITION PARTITIONS 6;

能够经过以上方式,增长指定数量的分区。

相关文章
相关标签/搜索