1.何为HASH分区?
故名思意,就是将列值通过特定的HASH函数计算后的值划分分区,HASH分区的目的是将数据均匀的分布到预先定义的各个分区中,保证数据均匀分布。
我们要做的是基于将要被散列的列值指定一个列值或表达式,以及指定被分区的表将要被分割的分区数量。
MySQL支持的HASH分区分为普通HASH分区和LINEAR HASH分区。
2.普通HASH分区实例学习
CREATE TABLE t_hash(
a int,
b datetime
)
partition by hash(year(b))
partitions 4;
上面建表语句中创建分区的意思是:根据b列的year()的函数值进行分区,计算方式是year(b)的值对4取余,
若结果为0,则该行数据会被放在p0分区
若结果为1,则该行数据会被放在p1分区
若结果为2,则该行数据会被放在p2分区
若结果为3,则该行数据会被放在p3分区
其中partitions 4代表着hash分区的数量为4,如果没有这个语句,分区数量默认为1.
下面插入一个记录:
INSERT INTO t_hash(a,b)values(1,'2014-10-01');
2014和4取余为2,所以该数据被放在p2分区中。
注意:HASH分区对于连续的列值做分区比较好,如自增长的主键,这样数据就能较好的分布。
3.LINEAR HASH分区
LINEAR HASH分区使用一个更加复杂的算法来确定插入到已分区的表中的位置。
用法如下:
CREATE TABLE t_linear_hash(
a int,
b datetime
)
partition by linear hash(year(b))
partitions 4;
对于这个分区,插入2010-04-01这条记录,这次MySQL数据库根据以下方法来对分区进行判断:
取大于分区数量4的下一个2的幂值V,V=POWER(2,CEILING(LOG(2,num)))=4.
所在分区N=YEAR(‘2010-04-01’)&(V-1)=2;
上面的算法不必深究,关键在于会用,知道其优缺点:
LINEAR HASH分区的优点在于增加,删除,合并和拆分分区将变得更加快捷,这有利于处理含有大量数据的表。
LINEAR HASH分区的缺点在于,与使用HASH分区得到的数据分布相比,各个分区间数据的分布可能不大均衡。
3.何为KEY分区?
KEY分区和HASH分区相似,不同之处在于HASH分区通过用户定义的函数进行分区,而KEY分区使用MySQL数据库提供的函数进行分区。
用法如下:
CREATE TABLE t_key(
a int,
b datetime
)
partition by key(b)
partitions 4;
不过这个分区的编号是通过2的幂值得到的,而不是通过模数算法计算出来的。
4.何为COLUMNS分区?
COLUMNS分区允许分区条件为非整型,分区根据类型直接比较而得到,不需要转化为整型。
此外,RANGE COLUMNS分区可以对多个列的值进行分区,COLUMNS分区支持以下数据类型:
所有整型
日期类型
字符串类型
用法如下:
CREATE TABLE t_columns_range(
a int,
b datetime
)
partition by range columns (b)(
partition p0 values less than ('2009-01-01'),
partition p1 values less than ('2010-01-01')
);
MySQL从5.5开始支持COLUMNS分区,对于前面的range分区和list分区,可以很好的利用RANGE COLUMNS分区和LIST COLUMNS分区代替。