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分区是从属于一个连续 ...
随机推荐
- 51. Word Search
Word Search Given a 2D board and a word, find if the word exists in the grid. The word can be constr ...
- Qlik 函数说明
集合表达式 包括 标识符 标识符 说明 1 表示应用程序中所有记录的完整集合,而不考虑选择的任何选择项.考虑维度 $ 表示当前选择项的记录.因此,集合表达式 {$} 与不陈述集合表达式的意义等同. $ ...
- Linux命令总结:file
转自:http://www.cnblogs.com/kerrycode/p/3806618.html 1.命令简介:用来识别文件类型,也可辨别一些文件的编码格式.它是通过查看文件的头部信息来获取文件类 ...
- frame中隐藏横向滚动条
设置frame的scrolling="yes",在右侧页面的body里加入: style="overflow-x:hidden;" 如:<body st ...
- 自动生成form Scripts
运行脚本: begin xxx_plsql_generator_pkg2.form_view_iud_p(p_block_name =>'CONTRACT_T' ,p_table_name =& ...
- MySQL把多个字段合并成一条记录的方法
转:http://www.111cn.net/database/mysql/71591.htm MySQL把多个字段合并成一条记录的方法 在mysql中字段合并可以使用很多函数来实现,如可以利用 GR ...
- c++子类调用基类方法的一个例子
Base.h #pragma once class Base { public: Base(void); ~Base(void); bool CreatClone( ...
- arpg网页游戏之地图(一)
[转]http://www.cnblogs.com/BlueWoods/p/4681572.html?from=timeline&isappinstalled=1 开发arpg网页游戏一项比较 ...
- 完整的Ajax及三级联动小练习
Ajax结构: var name = $("#text_1").val(); $.ajax({ url: "Ashxs/Handler.ashx",//一般处理 ...
- 解决Ubuntu下 Could NOT find CURL (missing: CURL_LIBRARY CURL_INCLUDE_DIR)
Ubuntu下CMake 编译时出现问题:Could NOT find CURL (missing: CURL_LIBRARY CURL_INCLUDE_DIR) 查找发现 # sudo apt-g ...