There's an echo in my head

日々のメモ。

MySQL 5.5から使えるようになったRANGE COLUMNSによるパーティショニング

それまで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が自動的にに付与されるのが地味にハマりそう。

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。