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 中相关的锁
May 25 MySQL
MySQL 不等于的三种使用及区别
Jun 03 MySQL
新手入门Mysql--sql执行过程
Jun 20 MySQL
为什么代码规范要求SQL语句不要过多的join
Jun 23 MySQL
MySQL基于索引的压力测试的实现
Nov 07 MySQL
MySQL数据库中varchar类型的数字比较大小的方法
Nov 17 MySQL
MySQL实战记录之如何快速定位慢SQL
Mar 23 MySQL
MySQL限制查询和数据排序介绍
Mar 25 MySQL
MySQL表锁、行锁、排它锁及共享锁的使用详解
Apr 02 MySQL
Mysql 文件配置解析介绍
May 06 MySQL
delete in子查询不走索引问题分析
Jul 07 MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
Dec 24 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可应用于面包屑导航的迭代寻找家谱树实现方法
2015/02/02 PHP
PHP结合jQuery实现找回密码
2015/07/22 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
extjs 时间范围选择自动判断的实现代码
2014/06/24 Javascript
JS+CSS实现模仿浏览器网页字符查找功能的方法
2015/02/26 Javascript
浅谈jQuery中replace()方法
2015/05/13 Javascript
纯javascript移动优先的幻灯片效果
2015/11/02 Javascript
jquery uploadify隐藏上传进度的实现方法
2017/02/06 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
React组件生命周期详解
2017/07/03 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
vue-cli 目录结构详细讲解总结
2019/01/15 Javascript
vue动态绑定class的几种常用方式小结
2019/05/21 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
2019/06/28 Javascript
微信小程序 行的删除和增加操作实现详解
2019/09/29 Javascript
Vue 使用iframe引用html页面实现vue和html页面方法的调用操作
2020/11/16 Javascript
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
使用python Django做网页
2013/11/04 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
2017/07/10 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
2018/04/27 Python
pygame游戏之旅 创建游戏窗口界面
2018/11/20 Python
python基于递归解决背包问题详解
2019/07/03 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
python 读取、写入txt文件的示例
2020/09/27 Python
Html5移动端适配IphoneX等机型的方法
2019/06/25 HTML / CSS
叙述DBMS对数据控制功能有哪些
2016/06/12 面试题
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
一道输出判断型Java面试题
2014/10/01 面试题
热门专业求职信
2014/05/24 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
学校证明范文
2015/06/24 职场文书
Redis如何实现分布式锁
2021/08/23 Redis
PYTHON 使用 Pandas 删除某列指定值所在的行
2022/04/28 Python