MySQL数据库分区range分区(二)

按照range分区的表是通过如下一种方式进行分区的,每个分区包含那些分区表达式的值位于一个给定的连续区间内的行。这些区间要连续且不能相互重叠,使用values less than操作符来进行定义。

按照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子句的任何记录。

学习知识要善于思考,思考,再思。我就是靠这个方法成为科学家的。 —— 爱因斯坦
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号