MySql子分区

      前面已经学习了MySQL的分区管理,MySQL还提供了子分区这个概念,子分区是分区表中每个分区的再次分割,具体语法如下:

Sql代码    收藏代码
  1. CREATE TABLE `USER` (  
  2.   `USR_ID` INT(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',  
  3.   `CUSTORM_ID` INT(11) DEFAULT NULL COMMENT '客户代码',  
  4.   `STATUS` INT(11) DEFAULT NULL COMMENT '用户状态',  
  5.   `CREATE_DATE` DATETIME DEFAULT NULL COMMENT '创建日期',  
  6.   `ACTIV_CODE` VARCHAR(32) DEFAULT NULL COMMENT '激活码',  
  7.   `USR_TYPE` INT(11) DEFAULT NULL COMMENT '用户类型',  
  8.   PRIMARY KEY (`USR_ID`)  
  9. )  
  10. PARTITION BY RANGE (USR_ID) SUBPARTITION BY HASH(USR_ID)  
  11. SUBPARTITIONS 2  
  12. (  
  13.     PARTITION partition_0 VALUES LESS THAN (10000),  
  14.     PARTITION partition_1 VALUES LESS THAN (20000),  
  15.     PARTITION partition_2 VALUES LESS THAN (MAXVALUE)  
  16. );  

 

        表USER有3个RANGE分区。这3个分区中的每一个分区——partition_0,partition_1,partition_2 又被进一步分成了2个子分区。实际上,整个表被分成了3 * 2 = 6个分区。但是,由于PARTITION BY RANGE子句的作用,这些分区的头2个(也就是partition_0的两个子分区)只保存“USR_ID”列中值小于10000的那些记录。
        我们输入以下SQL来查看分区情况:

Sql代码    收藏代码
  1. SELECT table_name,partition_name,subpartition_name,partition_method,subpartition_method,partition_expression,subpartition_expression,partition_description FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='USER';  

 

        结果如下:

 

 

 

        在MySQL中,对于已经通过RANGE或LIST分区了的表再进行子分区是可能的。子分区既可以使用HASH希分区,也可以使用KEY分区。这也被称为复合分区(Composite Partitioning)。

为了对个别的子分区指定选项,使用SUBPARTITION 子句来明确定义子分区也是可能的。例如,创建在前面例子中给出的同一个表的、一个更加详细的方式如下:

Sql代码    收藏代码
  1. CREATE TABLE `USER` (  
  2.   `USR_ID` INT(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',  
  3.   `CUSTORM_ID` INT(11) DEFAULT NULL COMMENT '客户代码',  
  4.   `STATUS` INT(11) DEFAULT NULL COMMENT '用户状态',  
  5.   `CREATE_DATE` DATETIME DEFAULT NULL COMMENT '创建日期',  
  6.   `ACTIV_CODE` VARCHAR(32) DEFAULT NULL COMMENT '激活码',  
  7.   `USR_TYPE` INT(11) DEFAULT NULL COMMENT '用户类型',  
  8.   PRIMARY KEY (`USR_ID`)  
  9. )  
  10. PARTITION BY RANGE (USR_ID) SUBPARTITION BY HASH(USR_ID)  
  11. (  
  12.     PARTITION partition_0 VALUES LESS THAN (10000)  
  13.     (  
  14.             SUBPARTITION s0,  
  15.             SUBPARTITION s1  
  16.     ),  
  17.     PARTITION partition_1 VALUES LESS THAN (20000)  
  18.     (  
  19.             SUBPARTITION s2,  
  20.             SUBPARTITION s3  
  21.     ),  
  22.     PARTITION partition_2 VALUES LESS THAN (MAXVALUE)  
  23.     (  
  24.             SUBPARTITION s4,  
  25.             SUBPARTITION s5  
  26.     )  
  27. );  

 

        分区结果为:



 

 

        以下几点需要我们注意:

        1.每个分区必须有相同数量的子分区。
        2.注意两种子分区语句的语法,一个是SUBPARTITIONS+分区数;一个是在内部自定义声明。
        3.如果在一个分区表上的任何分区上使用SUBPARTITION 来明确定义任何子分区,那么就必须定义所有的子分区,否则会执行失败。即便这个语句包含了一个SUBPARTITIONS 2子句,但是它仍然会执行失败。
        4.每个SUBPARTITION 子句必须包括 (至少)子分区的一个名字。否则,你可能要对该子分区设置任何你所需要的选项,或者允许该子分区对那些选项采用其默认的设置。
        5.在每个分区内,子分区的名字必须是唯一的,但是在整个表中,没有必要保持唯一。例如,下面的CREATE TABLE 语句是有效的:

Sql代码    收藏代码
  1. CREATE TABLE `USER` (  
  2.   `USR_ID` INT(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',  
  3.   `CUSTORM_ID` INT(11) DEFAULT NULL COMMENT '客户代码',  
  4.   `STATUS` INT(11) DEFAULT NULL COMMENT '用户状态',  
  5.   `CREATE_DATE` DATETIME DEFAULT NULL COMMENT '创建日期',  
  6.   `ACTIV_CODE` VARCHAR(32) DEFAULT NULL COMMENT '激活码',  
  7.   `USR_TYPE` INT(11) DEFAULT NULL COMMENT '用户类型',  
  8.   PRIMARY KEY (`USR_ID`)  
  9. )  
  10. PARTITION BY RANGE (USR_ID) SUBPARTITION BY HASH(USR_ID)  
  11. (  
  12.     PARTITION partition_0 VALUES LESS THAN (10000)  
  13.     (  
  14.             SUBPARTITION s0,  
  15.             SUBPARTITION s1  
  16.     ),  
  17.     PARTITION partition_1 VALUES LESS THAN (20000)  
  18.     (  
  19.             SUBPARTITION s0,  
  20.             SUBPARTITION s1  
  21.     ),  
  22.     PARTITION partition_2 VALUES LESS THAN (MAXVALUE)  
  23.     (  
  24.             SUBPARTITION s0,  
  25.             SUBPARTITION s1  
  26.     )  
  27. );  

 

        子分区可以用于特别大的表,在多个磁盘间分配数据和索引。假设有6个磁盘(Linux),分别为/disk0,/disk1../disk5等。现在考虑下面的例子:

Sql代码    收藏代码
  1. CREATE TABLE `USER` (  
  2.   `USR_ID` INT(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',  
  3.   `CUSTORM_ID` INT(11) DEFAULT NULL COMMENT '客户代码',  
  4.   `STATUS` INT(11) DEFAULT NULL COMMENT '用户状态',  
  5.   `CREATE_DATE` DATETIME DEFAULT NULL COMMENT '创建日期',  
  6.   `ACTIV_CODE` VARCHAR(32) DEFAULT NULL COMMENT '激活码',  
  7.   `USR_TYPE` INT(11) DEFAULT NULL COMMENT '用户类型',  
  8.   PRIMARY KEY (`USR_ID`)  
  9. )  
  10. PARTITION BY RANGE (USR_ID) SUBPARTITION BY HASH(USR_ID)  
  11. (  
  12.     PARTITION partition_0 VALUES LESS THAN (10000)  
  13.     (  
  14.             SUBPARTITION s0   
  15.                 DATA DIRECTORY = '/disk0/data'   
  16.                 INDEX DIRECTORY = '/disk0/idx',  
  17.             SUBPARTITION s1   
  18.                 DATA DIRECTORY = '/disk1/data'   
  19.                 INDEX DIRECTORY = '/disk1/idx'  
  20.     ),  
  21.     PARTITION partition_1 VALUES LESS THAN (20000)  
  22.     (  
  23.             SUBPARTITION s2   
  24.                 DATA DIRECTORY = '/disk2/data'   
  25.                 INDEX DIRECTORY = '/disk2/idx',  
  26.             SUBPARTITION s3   
  27.                 DATA DIRECTORY = '/disk3/data'   
  28.                 INDEX DIRECTORY = '/disk3/idx'  
  29.     ),  
  30.     PARTITION partition_2 VALUES LESS THAN (MAXVALUE)  
  31.     (  
  32.             SUBPARTITION s4   
  33.                 DATA DIRECTORY = '/disk4/data'   
  34.                 INDEX DIRECTORY = '/disk4/idx',  
  35.             SUBPARTITION s5   
  36.                 DATA DIRECTORY = '/disk5/data'   
  37.                 INDEX DIRECTORY = '/disk5/idx'  
  38.     )  
  39. );  

 

        关于磁盘的分配还可以出现诸如数据文件与索引不在同一块磁盘的情况、数据量大的分区单独占有一块硬盘等等,这些还等我们在实际工作中灵活运用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值