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 20 MySQL
MySQL中出现乱码问题的终极解决宝典
May 26 MySQL
Mysql文件存储图文详解
Jun 01 MySQL
MySQL 百万级数据的4种查询优化方式
Jun 07 MySQL
解决mysql的int型主键自增问题
Jul 15 MySQL
SQL实现LeetCode(196.删除重复邮箱)
Aug 07 MySQL
一文搞清楚MySQL count(*)、count(1)、count(col)区别
Mar 03 MySQL
MySQL Server 层四个日志
Mar 31 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
MySql分区类型及创建分区的方法
Apr 13 MySQL
Mysql排查分析慢sql之explain实战案例
Apr 19 MySQL
MySQL数据库之存储过程 procedure
Jun 16 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
ThinkPHP自动验证失败的解决方法
2011/06/09 PHP
深入解析PHP中的(伪)多线程与多进程
2013/07/01 PHP
js中的数组Array定义与sort方法使用示例
2013/08/29 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
你未必知道的JavaScript和CSS交互的5种方法
2014/04/02 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
浅析JSONP技术原理及实现
2016/06/08 Javascript
12个非常有用的JavaScript技巧
2017/05/17 Javascript
NodeJS实现视频转码的示例代码
2017/11/18 NodeJs
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
2018/12/06 NodeJs
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
使用Mock.js生成前端测试数据
2020/12/13 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
python实现随机密码字典生成器示例
2014/04/09 Python
Python、Javascript中的闭包比较
2015/02/04 Python
Python列表生成器的循环技巧分享
2015/03/06 Python
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
Python中内置的日志模块logging用法详解
2016/07/12 Python
python基础教程之匿名函数lambda
2017/01/17 Python
python中通过预先编译正则表达式提高效率
2017/09/25 Python
Python批量更改文件名的实现方法
2017/10/29 Python
Python SQL查询并生成json文件操作示例
2018/08/17 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
python日期相关操作实例小结
2019/06/24 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
香港网上花店:FlowerAdvisor香港
2019/05/30 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
后进生转化工作制度
2014/01/17 职场文书
工程安全员岗位职责
2014/03/09 职场文书
理想演讲稿范文
2014/05/21 职场文书
跳槽求职信范文
2014/05/26 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书
前端vue+express实现文件的上传下载示例
2022/02/18 Vue.js