MySQL创建管理RANGE分区


Posted in MySQL onApril 13, 2022

介绍

RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区。在5.7版本中DATE、DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的RANGE COLUMN分区。RANGE分区必须的连续的且不能重叠。使用

“VALUES LESS THAN ()”来定义分区区间,非整形的范围值需要使用单引号,并且可以使用MAXVALUE作为分区的最高值。

一、RANGE分区

1.创建分区

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
    PARTITION p0 VALUES LESS THAN (6),
    PARTITION p1 VALUES LESS THAN (11),
    PARTITION p2 VALUES LESS THAN (16),
    PARTITION p3 VALUES LESS THAN (21)
);
alter table employees add index ix_store_id(store_id) ;alter table employees add index ix_job_code(job_code) ;

p0:指分区p0,这个分区名的取值可以随便取值只要同一个表里面的每个分区名不重复即可,也不需要非得从0开始,你也可以使用a、b、c、d。

THEN():分区的范围值,这个值只能的连续不重叠的从小到大的值。

2.性能分析

插入测试数据

insert into employees(id,job_code,store_id) values(1,1001,1),(2,1002,2),(3,1003,3),(4,1004,4);

MySQL创建管理RANGE分区

从执行计划可以看到两个查询都用到了分区的效果;如果细心估计会发现第二个查询没有走索引,并不是使用小于就不会走索引而且执行计划分析评估任务不走索引的效果会更好,事实却是如果当前查询整个分区的数据时使用索引的话还需要去查询其它的字段还不如直接扫描整个分区来的快。

3.增加分区

由于当前分区值的范围是小于21,当向分区表中插入一个超过分区范围的值时会报错。这个时候可以增加一个分区,当你不确定需要给一个多大的上限值时可以使用MAXVALUE

MySQL创建管理RANGE分区

alter table employees add PARTITION  (PARTITION p4 VALUES LESS THAN MAXVALUE);

注意:增加分区只能在最大端增加

4.删除分区

alter table employees drop  PARTITION p4;

注意:通过这种删除分区的方式会将分区中的数据也删除,慎用!!!!。但是通过删除分区的方式删除数据会比delete快很多,因为它相当于删除一个数据库一样因为每个分区都是一个独立的数据文件。用来删除历史分区数据是非常好的办法。

5.拆分合并分区

拆分合并分区统称为重新定义分区,拆分分为不会造成数据的丢失,只将会将数据从一个分区移动到另一个分区。

例1:将P0拆分成s1,s2两个分区

ALTER TABLE employees REORGANIZE PARTITION p0 INTO (
    PARTITION s0 VALUES LESS THAN (3),
    PARTITION s1 VALUES LESS THAN (6)
);

注意:原来分区p0的范围是[负无穷-6),所以新拆分的分区也必须是这范围,所以新的分区范围值最大不能超过6。

MySQL创建管理RANGE分区

分区由原来的p0[-6)变成了so[-3),s1[3-6),整个分区的范围还是不变。

例2:将s1,p1,p2合并为a,b两个分区

ALTER TABLE employees REORGANIZE PARTITION s1,p1,p2 INTO (
    PARTITION a VALUES LESS THAN (5),
    PARTITION b VALUES LESS THAN (16)
);

原本的s1,p1,p2分区范围是:[3-16)所以新的分区也必须和原本的分区相同,所以新的分区的值不能低于3不能高于16即可。

MySQL创建管理RANGE分区

分区由原来的s1[3-6),p1[6-11),p2[11-16)变成了现在的a[3-5),b[5-16),总的范围没有发生变化

注意:无论是拆分还是合并分区都不能改变分区原本的覆盖范围,并且合并分区只能合并连续的分区不能跳过分区合并;并且不能改变分区的类型,例如不能把range分区改成key分区等。

二、日期字段分区方法

注意:RANG分区针对日期字段进行分区可以使用时间类型的函数进行转换成整形,但是如果你的查询语句需要利用分区那么查询语句也需要使用相同的时间函数进行查询。

1.使用YEAR()函数进行分区

CREATE TABLE employees1 (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY RANGE ( YEAR(separated) ) (
    PARTITION p0 VALUES LESS THAN (1991),
    PARTITION p1 VALUES LESS THAN (1996),
    PARTITION p2 VALUES LESS THAN (2001),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);

插入测试数据

insert into employees1(id,separated,job_code,store_id) values(1,'1990-03-04',1001,1),(2,'1995-03-04',1002,2),(3,'1998-03-04',1003,3),(4,'2016-03-04',1004,4);

MySQL创建管理RANGE分区

对于日期字段分区,查询条件使用> 、< 、betnwen、=都会利用分区查询,如果条件使用函数转换则不会走分区,比如使用YEAR()。

2.TIMESTAMP类型的列的分区方法

针对TIMESTAMP的日期类型的字段需要使用专门的UNIX_TIMESTAMP()函数进行转换

CREATE TABLE quarterly_report_status (
    report_id INT NOT NULL,
    report_status VARCHAR(20) NOT NULL,
    report_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PARTITION BY RANGE ( UNIX_TIMESTAMP(report_updated) ) (
    PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-01 00:00:00') ),
    PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-04-01 00:00:00') ),
    PARTITION p2 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-07-01 00:00:00') ),
    PARTITION p3 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-10-01 00:00:00') ),
    PARTITION p4 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-01-01 00:00:00') ),
    PARTITION p5 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-04-01 00:00:00') ),
    PARTITION p6 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-07-01 00:00:00') ),
    PARTITION p7 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-10-01 00:00:00') ),
    PARTITION p8 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-01-01 00:00:00') ),
    PARTITION p9 VALUES LESS THAN (MAXVALUE)
);

三、null值处理

当往分区列中插入null值RANG 分区会将其当作最小值来处理即插入最小的分区中

CREATE TABLE test (
    id INT NOT NULL,
    store_id INT 
)
PARTITION BY RANGE (store_id) (
    PARTITION p0 VALUES LESS THAN (6),
    PARTITION p1 VALUES LESS THAN (11),
    PARTITION p2 VALUES LESS THAN (16),
    PARTITION p3 VALUES LESS THAN (21)
);
insert into test(id,store_id) values(1,null);
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='test';

MySQL创建管理RANGE分区

备注:文章中的示例摘自mysql官方参考手册

四、移除表的分区

ALTER TABLE tablename
REMOVE PARTITIONING ;

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

总结

有两点非常重要需要注意,第一删除分区时要慎重因为会连同分区里的数据一并删除,拆分合并分区新的分区一定要和原来的分区的范围一致。RANGE COLUMN分区单独用章节进行讲解,。

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

MySQL 相关文章推荐
mysql批量新增和存储的方法实例
Apr 07 MySQL
MySQL创建高性能索引的全步骤
May 02 MySQL
解读MySQL的客户端和服务端协议
May 10 MySQL
MySQL时间盲注的五种延时方法实现
May 18 MySQL
MySQL 百万级数据的4种查询优化方式
Jun 07 MySQL
Mysql关于数据库是否应该使用外键约束详解说明
Oct 24 MySQL
MySQL Innodb索引机制详细介绍
Nov 23 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
Mar 13 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
MySQL中一条SQL查询语句是如何执行的
Apr 08 MySQL
MySQL创建管理KEY分区
Apr 13 MySQL
MySQL数据库Innodb 引擎实现mvcc锁
May 06 MySQL
MySQL创建管理LIST分区
Apr 13 #MySQL
MySql分区类型及创建分区的方法
Apr 13 #MySQL
深入理解mysql事务隔离级别和存储引擎
mysql使用 not int 子查询隐含陷阱
Apr 12 #MySQL
MySQL数据库如何使用Shell进行连接
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
Apr 12 #MySQL
MySQL事务操作的四大特性以及并发事务问题
You might like
PHP实现的折半查询算法示例
2017/10/09 PHP
总结PHP中初始化空数组的最佳方法
2019/02/13 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
用unescape反编码得出汉字示例
2014/04/24 Javascript
快速学习jQuery插件 Form表单插件使用方法
2015/12/01 Javascript
不定义JQuery插件 不要说会JQuery
2016/03/07 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
微信小程序tabbar底部导航
2018/11/05 Javascript
Node.js 多线程完全指南总结
2019/03/27 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
Vue根据条件添加click事件的方式
2019/11/09 Javascript
js实现计时器秒表功能
2019/12/16 Javascript
js对象属性名驼峰式转下划线的实例代码
2020/09/17 Javascript
理解python正则表达式
2016/01/15 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
简单实现python收发邮件功能
2018/01/05 Python
python爬虫之验证码篇3-滑动验证码识别技术
2019/04/11 Python
python实现银联支付和支付宝支付接入
2019/05/07 Python
Python 函数list&amp;read&amp;seek详解
2019/08/28 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
用python对oracle进行简单性能测试
2020/12/05 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
Python是如何进行类型转换的
2013/06/09 面试题
应届护士推荐信
2013/11/16 职场文书
模具专业毕业推荐信
2014/03/08 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
2015年重阳节主持词
2015/07/04 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
幼儿园教师辞职信
2019/06/21 职场文书
Java比较两个对象中全部属性值是否相等的方法
2021/08/07 Java/Android