DROP TABLE IF EXISTS temp;
CREATE TABLE `temp` (
`CallID` bigint(8) unsigned NOT NULL,
`InfoID` bigint(8) unsigned NOT NULL,
`CallStartTime` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
PARTITION BY RANGE (TO_DAYS(CallStartTime))
(
PARTITION p0 VALUES LESS THAN (TO_DAYS('2013-06-01 00:00:00' )),
PARTITION p1 VALUES LESS THAN (TO_DAYS('2013-07-01 00:00:00')),
PARTITION p2 VALUES LESS THAN (TO_DAYS('2013-08-01 00:00:00')),
PARTITION p3 VALUES LESS THAN (TO_DAYS('2013-09-02 00:00:00'))) ;
我在示例查询中使用EXPLAIN,我得到了下一个结果:
EXPLAIN PARTITIONS SELECT * FROM temp where CallStartTime >= '2013-07-13 00:10:06' AND CallStartTime <= '2013-07-22 10:24:00'
id select_type表分区类型possible_keys key key_len ref rows Extra
1 SIMPLE temp p0,p2 ALL 3使用位置
我不知道为什么它使用的是p0分区,它不在BETWEEN语句中指定的日期之间。
答案 0 :(得分:1)
http://dev.mysql.com/doc/refman/5.5/en/partitioning-range.html 在页面底部说:
2.使用DATE或DATETIME列作为分区列,通过RANGE COLUMNS对表进行分区。例如,可以使用连接列直接定义成员表,如下所示: ........
因此,对于您的示例,它看起来像这样: 按范围栏划分(CallStartTime)( PARTITION p0 VALUES比('2013-06-01 00:00:00'), ....
即使我从一开始就不明白为什么你的例子不起作用,但看起来分区中仍然存在一些错误。
贝恩德
答案 1 :(得分:0)
RANGE COLUMNS不支持使用除DATE或DATETIME以外的日期或时间类型的分区列。
DATE和DATETIME。 使用与日期或时间相关的其他数据类型的列不支持作为分区列。