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 亿级数据导入导出及迁移笔记
Jun 18 MySQL
MySQL 使用索引扫描进行排序
Jun 20 MySQL
详解MySQL多版本并发控制机制(MVCC)源码
Jun 23 MySQL
MySQL系列之四 SQL语法
Jul 02 MySQL
MySQL系列之九 mysql查询缓存及索引
Jul 02 MySQL
MySQL系列之十 MySQL事务隔离实现并发控制
Jul 02 MySQL
解决mysql的int型主键自增问题
Jul 15 MySQL
一篇文章带你深入了解Mysql触发器
Aug 02 MySQL
浅谈MySQL中的六种日志
Mar 23 MySQL
mysql查询结果实现多列拼接查询
Apr 03 MySQL
使用Mysql计算地址的经纬度距离和实时位置信息
Apr 29 MySQL
手把手带你彻底卸载MySQL数据库
Jun 14 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
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
php中动态修改ini配置
2014/10/14 PHP
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
jQuery Tools tab(幻灯片)
2012/07/14 Javascript
javascript中数组的concat()方法使用介绍
2013/12/18 Javascript
Jquery解析Json格式数据过程代码
2014/10/17 Javascript
浅谈Javascript数组的使用
2015/07/29 Javascript
jQuery Ajax 加载数据时异步显示加载动画
2016/08/01 Javascript
微信小程序 页面之间传参实例详解
2017/01/13 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
2017/08/28 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
2018/07/02 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
基于JavaScript 实现拖放功能
2019/09/12 Javascript
[01:01]2020完美高校联赛(秋)西安落幕
2021/03/11 DOTA
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
python创建进程fork用法
2015/06/04 Python
python中使用序列的方法
2015/08/03 Python
MAC中PyCharm设置python3解释器
2017/12/15 Python
Python使用装饰器进行django开发实例代码
2018/02/06 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
Python sqlite3查询操作过程解析
2020/02/20 Python
详解python模块pychartdir安装及导入问题
2020/10/22 Python
艺术专业大学生自我评价
2013/09/22 职场文书
高校毕业生登记表自我鉴定
2013/11/03 职场文书
水电工岗位职责
2014/02/12 职场文书
政协常委会议主持词
2015/07/03 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
销售口号霸气押韵
2015/12/24 职场文书
2019最新校园运动会广播稿!
2019/06/28 职场文书