系统业务是按照时间分区,
按网上大部分人的分区方式:
CREATE TABLE aaa(
id INT,
dt DATETIME NOT NULL
)
PARTITION BY RANGE (TO_DAYS(dt)) (
PARTITION p0 VALUES LESS THAN (TO_DAYS('2014-01-01')),
PARTITION p1 VALUES LESS THAN (TO_DAYS('2014-02-01')),
PARTITION p2 VALUES LESS THAN (TO_DAYS('2014-03-01')),
PARTITION p3 VALUES LESS THAN MAXVALUE);
要把分区列使用TO_DAYS()函数转换成int型才可以。
mysql5.5版本后支持对DateTime类型数据列直接分区,
所以可以改成这样
CREATE TABLE bbb (
id INT,
dt DATETIME NOT NULL)
PARTITION BY RANGE COLUMNS (dt)(
PARTITION p0 VALUES LESS THAN ('2014-01-01'),
PARTITION p1 VALUES LESS THAN ('2014-02-01'),
PARTITION p2 VALUES LESS THAN ('2014-03-01'),
PARTITION p04 VALUES LESS THAN (MAXVALUE));
通过时间分区,列类型不支持timestamp格式,用TO_DAYS()函数也不行,
必须换成datetime才可以。
使用分区后,查询条件必须加上分区列,where dt > '2014-01-01' and dt <'2014-02-01'
通过EXPLAIN PARTITIONS,可以看到改查询只扫描了p2分区。
不带条件的话会扫描所有分区,分区也就失去了意义。