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分区的更多相关文章

  1. MySQL 横向表分区之RANGE分区小结

    MySQL 横向表分区之RANGE分区小结 by:授客 QQ:1033553122 目录 简介 1 RANGE分区 1 创建分区表 1 查看表分区 2 新增表分区 2 新增数据 3 分区表查询 3 删 ...

  2. mysql分区之range分区

    随着互联网的发展,各方面的数据越来越多,从最近两年大数据越来越强的呼声中就可见一斑. 我们所做的项目虽算不上什么大项目,但是由于业务量的问题,数据也是相当的多. 数据一多,就很容易出现性能问题,而为了 ...

  3. 高性能可扩展mysql 笔记(三)Hash分区、RANGE分区、LIST分区

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.MySQL分区表操作 1.定义:数据库表分区是数据库基本设计规范之一,分区表在物理上表现为多个文件, ...

  4. MySQL数据表range分区例子

    某些行业数据量的增长速度极快,随着数据库中数据量的急速膨胀,数据库的插入和查询效率越来越低.此时,除了程序代码和查询语句外,还得在数据库的结构上做点更改:在一个主读辅写的数据库中,当数据表数据超过10 ...

  5. MySQL RANGE分区

    200 ? "200px" : this.width)!important;} --> 介绍 RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区 ...

  6. MySql采用range分区可提升查询效率

    简介: RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区.在5.7版本中DATE.DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的R ...

  7. [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 ...

  8. Mysql --分区表(5)Columns分区

    COLUMNS分区 COLUMNS分区是RANGE和LIST分区的变种.COLUMNS分区支持多列作为分区键进行分区 RANGE COLUNMS分区和LIST COLUMNS都支持非INT型列作为分区 ...

  9. Mysql --分区(4)List分区

    LIST分区 LIST分区是建立离散的值列表告诉数据库特定的值属于哪个分区,LIST分区在很多方面类似于RANGE分区,区别在LIST分区是从属于一个枚举列表的值得集合,RANGE分区是从属于一个连续 ...

随机推荐

  1. 黑马程序员_ C语言基础(一)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 开发过程: 编写->编译(只编译源文件,编译成*.o  只会检测语法是否合理,不会检测函数是 ...

  2. 解决eclipse中安装AIX2插件问题

    为了做webservice,查了下,需要用到AXIS2(当然也有别的方法,貌似更复杂,详情可以参看:java开发webservice的几种方式).可试了N次,下载的codegen和service插件始 ...

  3. Appium for Mac 环境准备篇

    之前写过一篇Appium for windows的文章,因为是09年的T400,启动Android模拟器的时候死机三次,那就公司申请台Macbook air吧,15寸的Macbook Pro实在太重了 ...

  4. ubuntu12.04 修改 主机名(hostname)

    1. sudo vim /etc/hostname -> hostname2. sudo vim /etc/hosts         -> 127.0.1.1       hostnam ...

  5. zend 快捷键

    Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当前 ...

  6. oracle net manager的配置文件tnsnames.ora位置

    配置文件所在的路径:C:\app\Ling-PC\product\11.2.0\client_1\network\admin     (红色为安装的盘符位置)

  7. time时间处理

    time模块的使用 import time print(time.time()) 输出: 1476798696.6639342 #表示从1970 年 1 月 1 日 00:00:00到当前的秒数 pr ...

  8. 编程范式 episode3 and 4,5

    episode 3 --storage structure. ampersand operate with asterisk --library function episode 4 --generi ...

  9. 底部tab的返回退出和对话框

    第一种: private long exitTime = 0; @Override public boolean dispatchKeyEvent(KeyEvent event) { if (even ...

  10. c#访问Oracle问题及解决方法

    Q:访问oracle 查询条件带汉字结果集为空的问题 A:数据库连接字符串中加入Unicode=true即可. 如 <add key="DbConnectionString" ...