RANGE分区
把连续区间按范围划分,是实战最常用的一种分区类型,行数据基于属于一个给定的连续区间的列值被放入分区。
代码语言:javascript复制但是记住,当插入的数据不在一个分区中定义的值的时候,会抛异常。
RANGE分区主要用于日期列的分区,比如交易表啊,销售表啊等。可以根据年月来存放数据。
如果你分区走的唯一索引中date类型的数据,
那么注意了,优化器只能对YEAR(),TO_DAYS(),TO_SECONDS(),UNIX_TIMESTAMP()这类函数进行优化选择。
实战中可以用int类型的字段来存时间戳做分区列,那么只用存yyyyMM就好了,也不用关心函数了。
代码语言:javascript复制CREATE TABLE
`Order` (
`id`
INT NOT NULL AUTO_INCREMENT,
`partition_key`
INT NOT NULL,
`amt`
DECIMAL(5) NULL) PARTITION BY RANGE(partition_key)
PARTITIONS 5(
PARTITION part0 VALUES LESS THAN(201901),
PARTITION part1 VALUES LESS THAN(201902),
PARTITION part2 VALUES LESS THAN(201903),
PARTITION part3 VALUES LESS THAN(201904),
PARTITION part4 VALUES LESS THAN(201905),
PARTITION part4 VALUES LESS THAN MAXVALUE;
INSERT INTO `Order` (`id`, `partition_key`, `amt`) VALUES ('1', '201901', '1000');
INSERT INTO `Order` (`id`, `partition_key`, `amt`) VALUES ('2', '201902', '800');
INSERT INTO `Order` (`id`, `partition_key`, `amt`) VALUES ('3', '201903', '1200');
RANGE分区通过使用PARTITION BY RANGE(expr)实现 , 其中“expr” 可以是某个列值, 或一个基于某个列值并返回一个整数值的表达式,如YEAR(date)。
不过值得注意的是,expr的返回值,不可以为NULL。
VALUES LESS THAN的排列必须从小到大顺序列出,这样MySQL才能识别一个一个的区间段。
涉及聚合函数SUM()、COUNT()的查询时,如果不指定分区,那么会在每个分区上并行处理。