パーティショニング

バージョン5.1からパーティショニング機能をMySQLでも使えるようになりました。
テーブルの検索高速化やログ情報などの一括削除などに有効なテクニックです。

■パーティショニングとは
一定のルールであるテーブルに格納されるレコードを分割して保存する機能です。
感覚的には、複数のテーブルをひとつのテーブルとして扱えるといったイメージでしょうか。
肥大化したテーブルで走らせるDELETEはとても遅くて負荷の大きい処理となりますが、パーティショニングを行っている場合、パーティションごと削除することでとても高速に不要データの削除・パージ処理を行うことができます。
また、テーブルに適切なパーティショニングを設定することで検索対象行を減らすことができ、検索を高速化することも可能です。

■パーティショニングの種類
主なパーティションの分割設定方法は以下の通りです

①RANGEパーティショニング
RANGEパーティショニングはパーティショニングに使用するカラムの値の範囲を指定してパーティショニングします。
主に日付や連番IDなどのカラムでパーティショニングしたい場合にRANGEパーティショニングが有効に機能します。
ログデータや時系列データなど連続的にデータが存在する場合に有効です。

②LISTパーティショニング
LISTパーティショニングはパーティショニングに使用するカラムがとりうる値のバリエーションが限られている場合に利用できます。
カラムがとりうる値毎にパーティションを作成し、そのカラムの値毎にパーティショニングされます。
性別、地域、都道府県などのカテゴリ別にデータを分割したい場合に有効です。

③HASHパーティショニング
HASHパーティショニングはパーティショニングに使用するカラムの数字をパーティション数で割り算したときの剰余(余り)の数字が等しいものを同グループとしてパーティショニングします。
レンジ、リスト化できない不連続なデータを均一に分割する場合に有効です。

■パーティショニングの定義
以下のテーブルにパーティショニングを設定する例を考えます。

CREATE TABLE logs (
uid BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
pid BIGINT UNSIGNED NOT NULL,
created DATETIME NOT NULL,
amount INT UNSIGNED NOT NULL,
PRIMARY KEY (uid,pid,created)
)

①RANGEパーティショニング
createdを使って年ごとに分割します。
ALTER TABLE logs PARTITION BY RANGE (YEAR(created)) (
PARTITION p2013 VALUES LESS THAN (2013) ENGINE = InnoDB,
PARTITION p2014 VALUES LESS THAN (2014) ENGINE = InnoDB,
PARTITION p2015 VALUES LESS THAN (2015) ENGINE = InnoDB,
PARTITION p2016 VALUES LESS THAN (2016) ENGINE = InnoDB,
PARTITION p2017 VALUES LESS THAN (2017) ENGINE = InnoDB,
PARTITION p2018 VALUES LESS THAN (2018) ENGINE = InnoDB,
PARTITION p2019 VALUES LESS THAN (2019) ENGINE = InnoDB,
PARTITION p2020 VALUES LESS THAN (2020) ENGINE = InnoDB,
PARTITION pmax VALUES LESS THAN MAXVALUE
);

※AXVALUEを使って設定したパーティションルール以降のデータが入るエリアを確保しておくことができます。
ただし、RANGEパーティションは「今あるパーティションの後ろ」にしかパーティションを追加できないため、MAXVALUEを使ってパーティションを設定すると新しいパーティションを後から追加することができなくなります。(後述)

②LISTパーティショニング
pidを使ってpidごとに分割します。
ALTER TABLE logs PARTITION BY LIST (pid) (
PARTITION p0 VALUES IN (0),
PARTITION p1 VALUES IN (1),
PARTITION p2 VALUES IN (2),
PARTITION p3 VALUES IN (3),
PARTITION p4 VALUES IN (4),
PARTITION p5 VALUES IN (5)
);

③HASHパーティショニング
uidを使って20パーティションに分割します。
ALTER TABLE logs PARTITION BY HASH (uid) PARTITIONS 20;

■パーティションの追加と削除
パーティションの追加は基本的に今あるパーティションの後ろにしかできません。
MAXVALUEを使っている場合や、今あるパーティションより前に新しいパーティションを作成したい場合にはパーティションの再構成が必要となります。

①パーティションの追加
ALTER TABLE logs ADD PARTITION ( PARTITION p2021 VALUES LESS THAN (2021) ENGINE = InnoDB );

②パーティションの削除
ALTER TABLE logs DROP PARTITION p2013;

③パーティションの再構成
パーティションの再構成とはパーティションの追加ではなく、あるパーティションのデータをパーティショニングしなおす処理です。

※後ろにパーティションを追加したい
ALTER TABLE logs REORGANIZE PARTITION pmax INTO (
PARTITION p2021 VALUES LESS THAN (2020) ENGINE=InnoDB,
PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE=InnoDB
);

※前にパーティションを追加したい
ALTER TABLE logs REORGANIZE PARTITION p2013 INTO (
PARTITION p2010 VALUES LESS THAN (2010),
PARTITION p2011 VALUES LESS THAN (2011),
PARTITION p2012 VALUES LESS THAN (2012),
PARTITION p2013 VALUES LESS THAN (2013)
);

関連記事

コメントは利用できません。

ページ上部へ戻る