`

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. );  

 

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

分享到:
评论

相关推荐

    MySQL分区分表方案实践手册

    - **复合分区**:可以在RANGE/LIST类型的分区表的基础上进一步进行子分区。子分区可以采用HASH/KEY等方式,从而提供更细粒度的分区控制。 #### 三、MySQL分区表常用操作示例 接下来通过具体的示例来展示如何创建...

    详细介绍Mysql5.1分区技术

    详细介绍mysql5.1 分区技术,通过对list range hash key四种分区技术的举例阐述Mysql分区,18.2.1. RANGE分区 18.2.2. LIST分区 18.2.3. HASH分区 ...18.2.5. 子分区 18.2.6. MySQL分区处理NULL值的方式

    Oracle10个分区和Mysql分区区别详解

    - Oracle 10g 提供了 Range-Hash 和 Range-List 组合分区,根分区是 Range,子分区可以是 Hash 或 List。这种方式在需要进一步细分数据或满足复杂查询需求时非常有用。 - MySQL 不直接支持组合分区,但可以通过...

    mysql如何进行分区-mysql分区有哪些方法.docx

    1. **存储能力增强**:相比于单一的磁盘或文件系统分区,MySQL 分区可以存储更多数据。 2. **数据清理便捷**:可以更简单地删除不再需要或过时的数据。 3. **查询优化**:某些查询可以直接在特定分区上执行,减少...

    mysql-存储分区-实验八.docx

    - 子分区的创建,例如将Range分区进一步细分为两个子分区。 - 数据迁移和处理,例如将5月数据复制到新表,增加amount后再放回原分区表。 - 计算不同分区数下的Hash值,理解其分布规律。 3. **问题与解决**: - ...

    mysql如何进行分区-mysql分区有哪些方法.pdf

    针对大规模数据存储,MySQL 提供了一种高效的管理策略——分区(Partitioning),这有助于提高查询性能,尤其是在处理海量数据时。分区是将一个大表划分为逻辑上独立的部分,每个部分(或称为分区)可以在物理上分散...

    MySQL分区分表的设计及实现-收藏备用.pdf

    分区技术可以将大表拆分成多个较小的子表(分区),每个子表只包含原始表的一部分数据,这样可以显著减少单次查询所需要扫描的数据量,从而提高查询效率。 ##### 2.2 MySQL的分区方式 MySQL提供了多种分区策略来...

    MySQL分区和分表技术总结.docx

    MySQL 分区和分表技术总结 MySQL 分区和分表技术是数据库性能优化的重要手段,特别是在大型数据库系统中。以下是 MySQL 分区和分表技术的详细介绍: 什么是分表? 分表是将一个大表按照一定的规则分解成多张具有...

    (mysql面试题)MySQL中的分区表的概念及其作用及代码展示.txt

    ### MySQL中的分区表概念及其作用 #### 一、分区表定义 在MySQL中,分区表是一种高级技术,它允许用户将一个大型表物理地分割成若干个较小的部分,即分区。这种分割方式不仅可以显著提高查询效率,还可以简化数据...

    通过实例学习MySQL分区表原理及常用操作

    13) 只有RANGE和LIST分区可以进行子分区,且子分区类型限于HASH或KEY。 分区类型主要包括: 1) 水平分区:根据列属性按行划分,常见模式有: - RANGE:按指定范围进行分区,如按年份划分。 - HASH:基于列的哈希...

    MySQL的分区表(PartitionedTable)功能详解

    5. **复合分区**:在RANGE或LIST分区的基础上,进一步对每个分区进行子分区,可以是HASH或KEY类型。 创建分区表的示例: - `CREATE TABLE ... RANGE (price)` 创建基于价格范围的分区。 - `CREATE TABLE ... LIST ...

    mysql 安装 mysql安装

    默认路径通常为`C:\Program Files\MySQL\MySQL Server 5.1`,但为了保护数据不因系统恢复而丢失,推荐将MySQL安装在非系统分区,比如`D:\tools\mysql`。 在设置数据库物理文件路径时,注意不要使用默认的系统隐藏...

    什么是分表和分区 MySql数据库分区和分表方法

    MySQL数据库的分表和分区是两种常见的优化策略,旨在应对大数据量带来的性能问题。当一个表包含数百万甚至上千万的记录时,查询和插入操作可能会变得非常缓慢,导致整个数据库系统的性能下降。分表和分区的目标是...

    MySQL 5.7 中文文档

    6. **分区表增强**:5.7版本对分区表进行了优化,支持更多的分区策略,包括线性哈希分区和更多的子分区选项,提高了大表的管理和查询效率。 7. **安全增强**:MySQL 5.7加强了安全特性,如更好的密码加密策略、审计...

    mysql-server-mysql-8.3.0.tar.gz

    3. **窗口函数**:这是MySQL 8.0引入的新特性,允许在查询中执行复杂的计算,如排名、累计和分组,而无需使用子查询或自连接。 4. **JSON支持**:MySQL 8.x增强了对JSON数据类型的支持,提供了更丰富的JSON操作函数...

    mysql-installer-community-8.0.28.0 MySql数据库安装包

    8. **分区改进**:MySQL 8.0对分区功能进行了优化,提供了更多的分区策略,使得大数据管理和查询更高效。 9. **查询优化器改进**:新的优化器策略和统计信息收集方法,使得MySQL能更准确地选择最佳执行计划。 **...

    Mysql教程最全最详细pdf

    除了上述内容,教程可能还会涉及复制、分区、触发器、用户权限管理等高级主题,帮助读者进一步提升MySQL应用能力。 通过阅读《MySQL教程》这本详尽的PDF教材,你将能够系统地学习并掌握MySQL,无论你是初学者还是有...

    mysql 8.4.0 winx64

    4. 窗口函数:MySQL 8.4.0引入了窗口函数,这是一种高级查询技术,可以方便地进行排序、分组、计算累计值等操作,而无需使用子查询或自连接,从而简化复杂查询。 5. JSON支持:MySQL对JSON数据类型的处理能力增强,...

Global site tag (gtag.js) - Google Analytics