それまでDATEやDATETIMEによるパーティショニングではTO_DAYS()
関数を使って数値に変換する必要があったけど、MySQL 5.5からはRANGE COLUMNS
を使うことによって日付や時刻をそのまま書けるようになった。
DATETIMEだとこんな感じ。DATEも同様。
/* パーティショニングに使うカラムを主キーに入れる必要があるのは相変わらず */ ALTER TABLE events DROP PRIMARY KEY, ADD PRIMARY KEY(id, created_at); /* RANGEではなくRANGE COLUMNS、パーティショニングするカラムの比較値もそのまま */ ALTER TABLE events PARTITION BY RANGE COLUMNS(created_at) ( PARTITION p201303 VALUES LESS THAN ('2013-04-01 00:00:00'), PARTITION p201304 VALUES LESS THAN ('2013-05-01 00:00:00'), PARTITION p201305 VALUES LESS THAN ('2013-06-01 00:00:00'), PARTITION p201306 VALUES LESS THAN ('2013-07-01 00:00:00') );
ちなみにそれ以前は次のように書く必要があった。TO_DAYS()
だと日付単位なので、いまのほうが素直な感じ。
ALTER TABLE events PARTITION BY RANGE(TO_DAYS(created_at)) ( PARTITION p201303 VALUES LESS THAN (TO_DAYS('2013-04-01 00:00:00')), PARTITION p201304 VALUES LESS THAN (TO_DAYS('2013-05-01 00:00:00')), PARTITION p201305 VALUES LESS THAN (TO_DAYS('2013-06-01 00:00:00')), PARTITION p201306 VALUES LESS THAN (TO_DAYS('2013-07-01 00:00:00')) );
参考
今回の件とは関係ないけど、DATEとDATETIMEの比較では00:00:00が自動的にに付与されるのが地味にハマりそう。