ITPub博客

首页 > 数据库 > MySQL > MySQL range分区

MySQL range分区

MySQL 作者:ubuntulinuxjava 时间:2015-02-13 13:20:28 0 删除 编辑
来源:http://www.bug315.com/article/16.htm

按照range分区的表是通过如下一种方式进行分区的,每个分区包含那些分区表达式的值位于一个给定的连续区间内的行。这些区间要连续且不能相互重叠,使用values less than操作符来进行定义。在下面的几个例子中,假如你创建了如下表,该表保存有10个人员信息,这十个人员信息的编号从1到10。
CREATE TABLE person (
  id INT NOT NULL,
  NAME VARCHAR(100),
  age INT NOT NULL,
  takWork DATE NOT NULL
)
PARTITION BY RANGE(age) (
  PARTITION p0 VALUES LESS THAN(20),
  PARTITION p1 VALUES LESS THAN(30),
  PARTITION p2 VALUES LESS THAN(40),
  PARTITION p3 VALUES LESS THAN maxvalue
);
       以上按照员工的年龄分区,1到19岁的保存在p0分区中,20到29保存到p1中,依次类推。PARTITION p3 VALUES LESS THAN maxvalue是保存大于39岁的员工,如果没有申明改行,则当插入年龄大于39岁的员工时会跑出错误。

      在VALUES LESS THAN 子句中使用一个表达式也是可能的。这里最值得注意的限制是MySQL 必须能够计算表达式的返回值作为LESS THAN (<)比较的一部分;因此,表达式的值不能为NULL 。由于这个原因,人员表的id, age和takwork列已经被定义为非空(NOT NULL)。  

      除了可以根据人员年龄分割表数据外,你还可以使用一个基于两个DATE (日期)中的一个的表达式来分割表数据。例如,假定你想基于每个人员入职公司的年份来分割表,也就是说,YEAR(takwork)的值。
CREATE TABLE person(
  id INT NOT NULL,
  name VARCHAR(100),
  age INT NOT NULL,
  takWork DATE NOT NULL
)
PARTITION BY RANGE(YEAR(takWork))(
  PARTITION p0 VALUES LESS THAN(1990),
  PARTITION p1 VALUES LESS THAN(2000),
  PARTITION p2 VALUES LESS THAN(2010),
  PARTITION p3 VALUES LESS THAN maxvalue
);

RANGE分区在如下场合特别有用:
当需要删除“旧的”数据时。如果你使用上面最近的那个例子给出的分区方案,你只需简单地使用 “ALTER TABLE employees DROP PARTITION p0;”来删除所有在1990年前就已经入职的人员信息。对于有大量行的表,这比运行一个如“DELETE FROM personWHERE YEAR(takWork) <= 1990;”这样的一个DELETE查询要有效得多。
想要使用一个包含有日期或时间值,或包含有从一些其他级数开始增长的值的列。
经常运行直接依赖于用于分割表的列的查询。例如,当执行一个如“SELECT COUNT(*) FROM personWHERE YEAR(takWork) = 2000;”这样的查询时,MySQL可以很迅速地确定只有分区p2需要扫描,这是因为余下的分区不可能包含有符合该WHERE子句的任何记录。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26875129/viewspace-1435132/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: MySQL list分区
请登录后发表评论 登录
全部评论

注册时间:2015-01-20

  • 博文量
    12
  • 访问量
    19439