MySQL数据表分区

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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值