MySQL 5.5.14 TO_DAYS分区模式的奇怪行为

时间:2013-09-10 09:56:47

标签: mysql

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语句中指定的日期之间。

2 个答案:

答案 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。 使用与日期或时间相关的其他数据类型的列不支持作为分区列。