mysql5.1のパーティショニングを使う

mysql5.1の新機能であるパーティショニング(PARTITIONING)を使ってみたので使い方やら注意点やらまとめ。

最初にパーティションの区切りの基準になるカラムはプライマリキーじゃないといけないという制約があるのでプライマリキーを変更する。

ALTER TABLE entries DROP PRIMARY KEY, ADD PRIMARY KEY (id, blog_id);

実際にパーティションに分割する

ピンポイント数値で分割
ALTER TABLE entries PARTITION BY LIST (blog_id) (
  PARTITION p1 VALUES IN (1,3,7),
  PARTITION p2 VALUES IN (10,11)
);
数値範囲で分割
ALTER TABLE entries PARTITION BY RANGE (blog_id) (
  PARTITION p1 VALUES LESS THAN 3,
  PARTITION p2 VALUES LESS THAN 10,
  PARTITION p_max VALUES LESS THAN MAXVALUE
);
日付(DATE, DATETIME)の年で分割
ALTER TABLE entries PARTITION BY LIST (YEAR(updated_at)) (
  PARTITION p2007 VALUES IN (2007),
  PARTITION p2008 VALUES IN (2008)
);
日付(DATE, DATETIME)の月で分割
ALTER TABLE entries PARTITION BY RANGE (TO_DAYS(updated_at)) (
  PARTITION p200804 VALUES LESS THAN (TO_DAYS('2008-05-01')),
  PARTITION p200805 VALUES LESS THAN (TO_DAYS('2008-06-01')),
  PARTITION p200806 VALUES LESS THAN (TO_DAYS('2008-07-01'))
);
パーティションを追加する
ALTER TABLE entries ADD PARTITION (PARTITION p3 VALUES LESS THAN 100));

注意:RANGE分割でMAXVALUEを使っている場合に、ADD PARTITION をするとそのテーブルの操作が一切できなくなります。(5.1.23-rc で確認)

パーティションを削除する
ALTER TABLE entries DROP PARTITION p3;

注意:DROPするパーティションに入っているデータが全部消えます。

パーティショニング(分割)をやめる
ALTER TABLE entries REMOVE PARTITIONING;