1.1 List分区
List分区的SQL语句如下:
create table shareniu_range1
(
id int not null,
name varchar(50),
age int
)
partition by List(id)
(
partition p0 values in (1,3,5),
partition p1 values in (2,4,6),
partition p2 values in (7,8,9)
);
SQL语句非常的简单,使用partition by List语法即可。该方式的分区最大的弊端就是分区中的集合必须进行定义,比如1、3、5的位于p0分区。2、4、6的位于p1分区,7、8、9的位于p2分区。可能看到这里的处理就疑惑了,如果id值为10(不在上述定义的集合呢),那么插入数据的时候会报错如下所示:
Table has no partition for value 10。
报错的原因很简单,没有分区可以存储id值为10的数据。
因此使用List分区可以使用自身项目中的分类等不经常变化的数据。这样就可以将不同分类下面的数据存放在同一个位置。
使用注意事项:
(1) 如果试图操作的列值不在分区值的列表中,那么程序报错。List分区并没有提供类似LESS THAN MAXVALUE这样的包含其他值在内的定义,将要匹配的任何值均需要在集合中定义。
(2) List分区除了能和Range分区结合起来生成一个复合的子分区,还可以与key分区以及hash分区结合起来生成复合的自分区。
(3) Mysql5.5版本前的Range、List、Hash分区要求分区键必须是int类型,随后的版本支持非整数的Range和List分区,即RANGE columns和LIST columns。
1.2 RANGE columns分区
RANGE columns分区的使用如下:
CREATE TABLE shareniu_range2
(
id INT NOT NULL,
NAME VARCHAR(50),
age INT
)
PARTITION BY RANGE COLUMNS(NAME)
(
PARTITION p0 VALUES LESS THAN (‘name05’),
PARTITION p1 VALUES LESS THAN (‘name10’),
PARTITION p2 VALUES LESS THAN (‘name15’)
);
该方式创建的分区比较的时候是字符串的方式,并不是类似int的比较方式。因此不建议使用。
1.3 Hash分区
Hash分区的意义主要用于确保数据在预先确定数目的分区中追求平均分配。Hash分区会自动根据列计算需要插入的数据分布与那个分区。其使用的是hash分区键,然后根据分区的数量计算需要操作的分区。对于开发人员而言,要做的事情只是基于将要被哈希的列值指定一个表达式,以及指定被分区的表将要被分割的分区数量。具体使用如下:
create table shareniu_range3
(
id int not null,
name varchar(50),
age int
)
partition by hash(id)
partitions 3;
其中hash(id)中的id为分区键,partitions为分区的数量。
使用注意事项:
(1) 由于哈希分区每次更新、插入、删除一行数据,这个表达式都需要去计算一次,那就意味着非常复杂的表达式可能引擎性能的问题。尤其是在执行批量插入语句的时候。
(2) 最有效的哈希函数是只针对单个列进行计算,这个列的值最好随着列值进行增加,比如上述例子中使用的是int类型的列,这样哈希之后的数据分布的更加的均匀。因为这考虑了在分区范围内的修建,也就是说表达式值和他基于的列的值变化越接近,就更有效地使用该表达式进行哈希分区。
1.4 线性Hash分区
线性哈希分区在partition by子句中添加linear关键字即可。
线性哈希分区的优点在于 增加、删除、合并和拆分分区将变得更加快捷。有利于处理及其大量的数据的表,缺点在于数据可能分布的不太均匀。
1.5 key分区
该方式类型按照hash分区,Hash分区允许用户自定义表达式,但是key分区不支持用户自定义表达式。哈希分区支持整数分区,key分区支持除了blob和text类型之外的其他类型,换言之key分区支持的类型更多。
与哈希分区不同的是,创建key分区表的时候,可以不用指定分区键,默认会选择使用主键或者唯一键作为分区键。如果没有主键或者唯一键则需要指定分区键。Key分区说白了就是按照主键分区。其语法如下:
create table shareniu_range4
(
id int not null,
name varchar(50),
age int
)
partition by linear key(id)
partitions 3;