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分区是从属于一个连续 ...
随机推荐
- 黑马程序员_ C语言基础(一)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 开发过程: 编写->编译(只编译源文件,编译成*.o 只会检测语法是否合理,不会检测函数是 ...
- 解决eclipse中安装AIX2插件问题
为了做webservice,查了下,需要用到AXIS2(当然也有别的方法,貌似更复杂,详情可以参看:java开发webservice的几种方式).可试了N次,下载的codegen和service插件始 ...
- Appium for Mac 环境准备篇
之前写过一篇Appium for windows的文章,因为是09年的T400,启动Android模拟器的时候死机三次,那就公司申请台Macbook air吧,15寸的Macbook Pro实在太重了 ...
- ubuntu12.04 修改 主机名(hostname)
1. sudo vim /etc/hostname -> hostname2. sudo vim /etc/hosts -> 127.0.1.1 hostnam ...
- zend 快捷键
Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当前 ...
- oracle net manager的配置文件tnsnames.ora位置
配置文件所在的路径:C:\app\Ling-PC\product\11.2.0\client_1\network\admin (红色为安装的盘符位置)
- time时间处理
time模块的使用 import time print(time.time()) 输出: 1476798696.6639342 #表示从1970 年 1 月 1 日 00:00:00到当前的秒数 pr ...
- 编程范式 episode3 and 4,5
episode 3 --storage structure. ampersand operate with asterisk --library function episode 4 --generi ...
- 底部tab的返回退出和对话框
第一种: private long exitTime = 0; @Override public boolean dispatchKeyEvent(KeyEvent event) { if (even ...
- c#访问Oracle问题及解决方法
Q:访问oracle 查询条件带汉字结果集为空的问题 A:数据库连接字符串中加入Unicode=true即可. 如 <add key="DbConnectionString" ...