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