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. パーティション列として DATE または DATETIME 列を使用して、RANGE COLUMNS によってテーブルをパーティション化します。たとえば、次のように、結合された列を直接使用して members テーブルを定義できます。.......

あなたの例では、次のようになります: PARTITION BY RANGE COLUMNS(CallStartTime) ( PARTITION p0 VALUES LESS THAN ('2013-06-01 00:00:00' ), ....

あなたの例がうまくいかない理由は一見しただけではわかりませんが、パーティショニングにはまだいくつかのバグがあるようです。

ベルント

于 2013-09-10T11:46:47.343 に答える