Mysql --分区(3)range分区
3.分区类型
RANGE分区
按照range分区的表是利用取值范围将数据分成分区,区间要连续并且不能互相重叠,使用values less than操作符进行分区定义
CREATE TABLE tnp (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255),
PRIMARY KEY pk (id)
)
partition by range (id) (
partition p0 values less than(10),
partition p1 values less than(20),
partition p2 values less than(30)
);
当插入ID大于30的值是,会出现错误
可以在设置分区时使用values less than maxvalue子句
alter table tnp add partition(partition p3 values less than maxvalue);
MySQL支持在values less than子句中使用表达式,比如,以日期作为range分区的分区列:
CREATE TABLE emp_date (
id INT NOT NULL auto_increment,
name VARCHAR(255),
hiredate date not null default '1970-01-01',
key (id)
)
partition by range (year(hiredate)) (
partition p0 values less than(1995),
partition p1 values less than(2000),
partition p2 values less than(2005)
);
MySQL也支持对TIMESTAMP列进行range分区
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)
);
实际是是将TMESTAMP类型通过UNIX_TIMESTAMP函数转换成INT型
mysql> select UNIX_TIMESTAMP('2008-01-01 00:00:00');
+---------------------------------------+
| UNIX_TIMESTAMP('2008-01-01 00:00:00') |
+---------------------------------------+
| 1199116800 |
+---------------------------------------+
1 row in set (0.00 sec)
delimiter $$
drop procedure if exists pr_insertdate_2$$
create procedure pr_insertdate_2(in begindate date,in enddate date,in tabname varchar(40))
begin
set begindate = timestamp(begindate);
while begindate<enddate
do
set @s=concat_ws(' ','insert into',tabname,'values(1,''true'',''',begindate,''')');
prepare stmt from @s;
execute stmt;
drop prepare stmt;
set begindate = date_add(begindate,interval 1 day);
end while;
end$$
delimiter ;
mysql> call pr_insertdate_2('2007-01-01','2010-12-31','quarterly_report_status');
Query OK, 0 rows affected (0.32 sec)
mysql> select
-> partition_name part,
-> partition_expression expr,
-> partition_description descr,
-> table_rows
-> from information_schema.partitions where
-> table_schema = schema()
-> and table_name='quarterly_report_status';
+------+---------------------------------+------------+------------+
| part | expr | descr | table_rows |
+------+---------------------------------+------------+------------+
| p0 | UNIX_TIMESTAMP(report_updated) | 1199116800 | 365 |
| p1 | UNIX_TIMESTAMP(report_updated) | 1206979200 | 91 |
| p2 | UNIX_TIMESTAMP(report_updated) | 1214841600 | 91 |
| p3 | UNIX_TIMESTAMP(report_updated) | 1222790400 | 92 |
| p4 | UNIX_TIMESTAMP(report_updated) | 1230739200 | 92 |
| p5 | UNIX_TIMESTAMP(report_updated) | 1238515200 | 90 |
| p6 | UNIX_TIMESTAMP(report_updated) | 1246377600 | 91 |
| p7 | UNIX_TIMESTAMP(report_updated) | 1254326400 | 92 |
| p8 | UNIX_TIMESTAMP(report_updated) | 1262275200 | 92 |
| p9 | UNIX_TIMESTAMP(report_updated) | MAXVALUE | 364 |
+------+---------------------------------+------------+------------+
10 rows in set (0.00 sec)
涉及TIMESTAMP值的任何其他表达式不允许 (See Bug #42849.)
当一个或多个下列条件为真时,范围分区是特别有用的:
1.需要卸载旧数据
此时你就可以使用 ALTER TABLE employees DROP PARTITION p0;卸载旧数据,效率要比delete高很多
2.你想用一列包含日期或时间值,或包含从其他系列所产生的价值
You want to use a column containing date or time values, or containing values arising from some other series
3.where条件列经常为分区列。这个不用多说了,利用分区裁剪特性
Mysql --分区(3)range分区的更多相关文章
- MySQL 横向表分区之RANGE分区小结
MySQL 横向表分区之RANGE分区小结 by:授客 QQ:1033553122 目录 简介 1 RANGE分区 1 创建分区表 1 查看表分区 2 新增表分区 2 新增数据 3 分区表查询 3 删 ...
- mysql分区之range分区
随着互联网的发展,各方面的数据越来越多,从最近两年大数据越来越强的呼声中就可见一斑. 我们所做的项目虽算不上什么大项目,但是由于业务量的问题,数据也是相当的多. 数据一多,就很容易出现性能问题,而为了 ...
- 高性能可扩展mysql 笔记(三)Hash分区、RANGE分区、LIST分区
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.MySQL分区表操作 1.定义:数据库表分区是数据库基本设计规范之一,分区表在物理上表现为多个文件, ...
- MySQL数据表range分区例子
某些行业数据量的增长速度极快,随着数据库中数据量的急速膨胀,数据库的插入和查询效率越来越低.此时,除了程序代码和查询语句外,还得在数据库的结构上做点更改:在一个主读辅写的数据库中,当数据表数据超过10 ...
- MySQL RANGE分区
200 ? "200px" : this.width)!important;} --> 介绍 RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区 ...
- MySql采用range分区可提升查询效率
简介: RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区.在5.7版本中DATE.DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的R ...
- [MySQL Reference Manual] 20 分区
20 分区 20 分区 20.1 MySQL的分区概述 20.2 分区类型 20.2.1 RANGE分区 20.2.2 LIST分区 20.2.3 COLUMNS分区 20.2.3.1 RANGE C ...
- Mysql --分区表(5)Columns分区
COLUMNS分区 COLUMNS分区是RANGE和LIST分区的变种.COLUMNS分区支持多列作为分区键进行分区 RANGE COLUNMS分区和LIST COLUMNS都支持非INT型列作为分区 ...
- Mysql --分区(4)List分区
LIST分区 LIST分区是建立离散的值列表告诉数据库特定的值属于哪个分区,LIST分区在很多方面类似于RANGE分区,区别在LIST分区是从属于一个枚举列表的值得集合,RANGE分区是从属于一个连续 ...
随机推荐
- [SharpZipLib 未能加载文件或程序集] 解决方法
未能加载文件或程序集"ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6a ...
- [vB.NET]为控件添加鼠标悬浮时的提示气泡
实例代码: Dim k As ToolTip k = New ToolTip() k.AutoPopDelay = '显示出气泡后的延时时间(毫秒) k.InitialDelay = '出现前的延时( ...
- Linux网络状态工具ss命令使用详解
ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix dom ...
- PHP递归实现层级树状展现数据
树状数据展现很常用,今天学习了PHP的递归,也来总结总结! PHP代码: function _getTreeList_custom1($data,$parent_id,$depth) { $retur ...
- 一天天的sql总结
一. 多张表之间的查询: join/inner join on inner join 是比较运算符,只返回符合条件的行. left/outer join on 左外连接包含left join左表所有 ...
- MongoEngine简易教程(转)
原文:http://www.xefan.com/archives/84063.html Mongoengine教程(1)——概述 Mongoengine教程(2)——文档模式 Mongoengine教 ...
- 解决Django和EasyUI搭配使用时出现的CSRF问题
在<head></head>中添加以下代码即可: <script type="text/javascript"> $.ajaxSetup({ d ...
- 四则运算(Android)版
实验题目: 将小学四则运算整合成网页版或者是Android版.实现有无余数,减法有无负数.... 设计思路: 由于学到的基础知识不足,只能设计简单的加减乘除,界面设计简单,代码量少,只是达到了入门级的 ...
- Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)
上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&q ...
- 如何在其他电脑上运行VS2005编译的DEBUG版应用程序
做项目的过程中,遇到这样的问题:在自己的电脑上用VS2005编译好的DEBUG版程序在其它的没有安装VS2005的电脑上没有办法运行,郁闷至极啊. 直 接拷贝文件后,错误信息如下:"This ...