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 表示最大的可能的整数值。
示例: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分区来分割一个表,要在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;
示例:
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;