3
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 table partitions type possible_keys key key_len ref rows Extra

1 SIMPLE temp p0,p2 ALL 3 使用 where

我不知道为什么它使用不在 BETWEEN 语句中指定的日期之间的 p0 分区。

4

2 回答 2

1

http://dev.mysql.com/doc/refman/5.5/en/partitioning-range.html 在页面底部说:

2. 按 RANGE COLUMNS 对表进行分区,使用 DATE 或 DATETIME 列作为分区列。例如,可以直接使用连接列定义成员表,如下所示:........

因此,对于您的示例,它看起来像这样: PARTITION BY RANGE COLUMNS(CallStartTime) ( PARTITION p0 VALUES LESS THAN ('2013-06-01 00:00:00' ), ....

即使乍一看我也不明白为什么您的示例不起作用,但看起来分区中仍然存在一些错误。

伯恩德

于 2013-09-10T11:46:47.343 回答
0

RANGE COLUMNS 不支持使用采用日期或时间类型而非 DATE 或 DATETIME 的分区列。

日期和日期时间。不支持使用与日期或时间相关的其他数据类型的列作为分区列。

于 2013-09-10T13:47:36.363 回答