MySQL数据表分区类型
一、range 分区 (基于属于一个给定连续区间的列值,把多行分配给分区。)
示例:create table test(id int(11) not null auto_increment;name varchar(20);sex varchar(10);age int(11);primary key(id,age);)partition by range (age)(partition p1 values less than(10),partition p2 values less than(20),partition p3 values less than(30),partition p4 values less than MAXVALUE);//MAXVALUE 表示最大的可能的整数值。
二、list分区
(类似range分区,区别在于list分区是基于列值匹配一个离散值集合中的某个值来进行选择。)
示例:create table test(id int(11) not null auto_increment;name varchar(20);sex varchar(10);age int(11);primary key(id,sex);)partition by list (sex)(partition p1 values in("男"),partition p2 values in("女"));
三、hash分区
(基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。)
使用HASH分区来分割一个表,要在create table 语句上添加一个“partition by hash (expr)”子句,其中“expr”是一个返回一个整数的表达式。它可以仅仅是字段类型为MySQL整型的一列的名字。此外,你可能需要在后面再添加一个“partitions num”子句,其中num是一个非负的整数,它表示表将要被分割成分区的数量。
示例:
create table test(id int(11) not null auto_increment;name varchar(20);sex varchar(10);age int(11);primary key(id,age);)partition by hash (age) partitions 4;
如果没有包括一个PARTITIONS子句,那么分区的数量将默认为1。
四、key分区
(类似hash分区,区别在于key分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。)
示例:
create table test(id int(11) not null auto_increment;name varchar(20);sex varchar(10);age int(11);primary key(id,age);)partition by linear key(age)partitions 4;
在KEY分区中使用关键字LINEAR和在HASH分区中使用具有同样的作用,分区的编号是通过2的幂(powers-of-two)算法得到,而不是通过模数算法。
注意:ERROR 1503 A PRIMARY KEY must include all columns in the table's partitioning function
意思是说在分区的表达式中的条件字段必须是那个表定义的唯一键的一部分(part of every unique key that the table may have.)
上面报错的原因就是因为在数据表中定义了主键ID,但分区的属性不是主键。
解决方法:可以把主键ID扩展成联合主键(`ID`,分区的属性),这样分区的条件字段就成了主键的一部分,这样就可以解决。
添加表分区:alter table tablename
partition by list [ columns ] (region)
(
partition p1 values in (0),
partition p2 values in (1),
partition p3 values in (2),
partition p4 values in (3)
);
删除分区:
alter table tablename drop partition p1;