MySQL创建管理子分区


Posted in MySQL onApril 13, 2022

介绍

子分区其实是对每个分区表的每个分区进行再次分隔,目前只有RANGE和LIST分区的表可以再进行子分区,子分区只能是HASH或者KEY分区。子分区可以将原本的数据进行再次的分区划分。

一、创建子分区

子分区由两种创建方法,一种是不定义每个子分区子分区的名字和路径由分区决定,二是定义每个子分区的分区名和各自的路径

1.不定义每个子分区

CREATE TABLE tb_sub (id INT, purchased DATE)
    PARTITION BY RANGE( YEAR(purchased) )
    SUBPARTITION BY HASH( TO_DAYS(purchased) )
    SUBPARTITIONS 2 (
        PARTITION p0 VALUES LESS THAN (1990),
        PARTITION p1 VALUES LESS THAN (2000),
        PARTITION p2 VALUES LESS THAN MAXVALUE
    );
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION 
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='tb_sub';

MySQL创建管理子分区

2.定义每个子分区

定义子分区可以为每个子分区定义具体的分区名和分区路径

CREATE TABLE tb_sub_ev (id INT, purchased DATE)
    PARTITION BY RANGE( YEAR(purchased) )
    SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
        PARTITION p0 VALUES LESS THAN (1990) (
            SUBPARTITION s0,
            SUBPARTITION s1
        ),
        PARTITION p1 VALUES LESS THAN (2000) (
            SUBPARTITION s2,
            SUBPARTITION s3
        ),
        PARTITION p2 VALUES LESS THAN MAXVALUE (
            SUBPARTITION s4,
            SUBPARTITION s5
        )
    );

MySQL创建管理子分区

3.测试数据

INSERT INTO tb_sub_ev() VALUES(1,'1989-01-01'),(2,'1989-03-19'),(3,'1989-04-19');

当往里面插入三条记录时,其中‘1989-01-01’和‘1989-04-19’存储在p0_s0分区中,‘1989-03-19’存储在p0_s1当中

MySQL创建管理子分区

MySQL创建管理子分区

二、分区管理

分区管理和RANGE、LIST的分区管理是一样的

1.合并分区

将p0,p1两个分区合并

ALTER TABLE tb_sub_ev REORGANIZE PARTITION p0,p1 INTO (
    PARTITION m1 VALUES LESS THAN (2000)
    ( SUBPARTITION n0,
      SUBPARTITION n1
     ) 
    
);

MySQL创建管理子分区

注意:合并分区的子分区也必须是两个,这点需要理解,因为必须和创建分区时每个分区只有两个子分区保持一致,合并分区不会造成数据的丢失。

2.拆分分区

ALTER TABLE tb_sub_ev REORGANIZE PARTITION m1 INTO (
     PARTITION p0 VALUES LESS THAN (1990) (
            SUBPARTITION s0,
            SUBPARTITION s1
        ),
        PARTITION p1 VALUES LESS THAN (2000) (
            SUBPARTITION s2,
            SUBPARTITION s3
        )
    
);

同样,拆分分区也必须保证每个分区是两个子分区。

3.删除分区

ALTER TABLE  tb_sub_ev DROP PARTITION P0;

注意:由于分区是RANGE和LIST分区,所以删除分区也是同RANGE和LIST分区一样,这里只能对每个分区进行删除,不能针对每个子分区进行删除操作,删除分区后子分区连同数据一并被删除。

三、错误的子分区创建

1.要不不定义各个子分区要不就每个都需要定义

CREATE TABLE tb_sub_ev_nex (id INT, purchased DATE)
    PARTITION BY RANGE( YEAR(purchased) )
    SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
        PARTITION p0 VALUES LESS THAN (1990) (
            SUBPARTITION s0,
            SUBPARTITION s1
        ),
        PARTITION p1 VALUES LESS THAN (2000),
        PARTITION p2 VALUES LESS THAN MAXVALUE (
            SUBPARTITION s4,
            SUBPARTITION s5
        )
    );

这里由于分区p1没有定义子分区,所以创建分区失败

四、移除表的分区

ALTER TABLE tablename
REMOVE PARTITIONING ;

注意:使用remove移除分区是仅仅移除分区的定义,并不会删除数据和drop PARTITION不一样,后者会连同数据一起删除

总结

子分区的好处是可以对分区的数据进行再分,这样数据就更加的分散,同时还可以对每个子分区定义各自的存储路径,这部分内容在指定各分区路径的下一篇文章中单独进行讲解。

到此这篇关于MySQL分区之子分区的文章就介绍到这了!

MySQL 相关文章推荐
MySQL安装后默认自带数据库的作用详解
Apr 27 MySQL
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 MySQL
教你解决往mysql数据库中存入汉字报错的方法
May 06 MySQL
MySQL删除和插入数据很慢的问题解决
Jun 03 MySQL
MYSQL 无法识别中文的永久解决方法
Jun 03 MySQL
MySQL query_cache_type 参数与使用详解
Jul 01 MySQL
MYSQL 的10大经典优化案例场景实战
Sep 14 MySQL
MySQL空间数据存储及函数
Sep 25 MySQL
MySQL面试题讲解之如何设置Hash索引
Nov 01 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
一文了解MYSQL三大范式和表约束
Apr 03 MySQL
MySQL中JOIN连接的基本用法实例
Jun 05 MySQL
MySQL创建管理KEY分区
Apr 13 #MySQL
MySQL创建管理HASH分区
Apr 13 #MySQL
MySQL创建管理RANGE分区
Apr 13 #MySQL
MySQL创建管理LIST分区
Apr 13 #MySQL
MySql分区类型及创建分区的方法
Apr 13 #MySQL
深入理解mysql事务隔离级别和存储引擎
mysql使用 not int 子查询隐含陷阱
Apr 12 #MySQL
You might like
深入array multisort排序原理的详解
2013/06/18 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
php无限极分类实现方法分析
2019/07/04 PHP
IE和Mozilla的兼容性汇总event
2007/08/12 Javascript
jQuery实现的立体文字渐变效果
2010/05/17 Javascript
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
2011/07/04 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
浅谈javascript获取元素transform参数
2015/07/24 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
2015/11/18 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
微信小程序select下拉框实现源码
2019/11/08 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
Python升级提示Tkinter模块找不到的解决方法
2014/08/22 Python
Python实现的简单发送邮件脚本分享
2014/11/07 Python
在Python中操作列表之list.extend()方法的使用
2015/05/20 Python
Python实现处理管道的方法
2015/06/04 Python
python代码实现ID3决策树算法
2017/12/20 Python
python主线程与子线程的结束顺序实例解析
2019/12/17 Python
如何理解Python中的变量
2020/06/01 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
今天学到的CSS最新技术(与图片背景相关)
2012/12/24 HTML / CSS
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
锐步英国官网:Reebok英国
2019/11/29 全球购物
代理班主任的自我评价
2014/02/04 职场文书
经典禁毒标语
2014/06/16 职场文书
前台接待岗位职责范本
2015/04/03 职场文书
员工离职通知函
2015/04/25 职场文书
2015年大班保育员工作总结
2015/05/18 职场文书
教你用eclipse连接mysql数据库
2021/04/22 MySQL
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js