平成22年6月7日月曜日

MySQL Partitionsの応用ーー①作成編

Partitionsメリット:
①パフォーマンス:
×1年間のclickデータを全て「click」というテーブルに入ったら、5月のデータ中になんとか検索したい場合、以下のSQLを使います
select * from click where created >= '2010-05-01 00:00:00' and created <= '2010-05-31 00:00:00' and user_info = 'hoge'

その場合、もしindexを使いたいなら、まずindex(created,user_info)を作らないといけないです。そして、一年間のデータが数百万がある場合、index自体も大きくて、insert時のパフォーマンスに影響があります。

★この時Partitionsを使ったら
・検索範囲が5月のPartitionだけです(月単位でPartitionする場合)ので、indexがなくても、データ量が少ないので、相対早くなります。
・indexはPartition単位で作ってますので、一年間のデータのindexより軽い。(Partition単位でindexファイル設定できますので、推計した結果)

②管理
・同じファイルを複数のファイルで分けれるので、テーブルの大きさの制限がなくなります。
・旧いデータを削除場合、旧いPartitionを削除すれば、OKです
ALTER TABLE employees DROP PARTITION p0


では、早速テーブルを作りましょう

CREATE TABLE action (
action_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
created DATETIME NOT NULL,
updated DATETIME NOT NULL,
deleted TINYINT NOT NULL DEFAULT 0,
PRIMARY KEY (action_id,created),
index(created)
)ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_bin
PARTITION BY RANGE (TO_DAYS(created))
(PARTITION p201005 VALUES LESS THAN (734289) ENGINE = InnoDB,
PARTITION p201006 VALUES LESS THAN (734319) ENGINE = InnoDB);


この作成用のSQLに幾つかの注意点があります。
①PRIMARY KEY (action_id,created)
Partitionのキーワード(ここはcreatedは必ず全てのPrimary Key,Unique Keyのカラムの一部分)
②検索時、Partitionのキーワードを見て、該当Partitionだけ検索するFuncはTO_DAYSとYEARだけです
↑の意味は分かりにくいかもしれないので、例で見てみましょう。
explain partitions select * from click where created >= '2010-05-01 00:00:00' and created <= '2010-05-31 00:00:00'

このSQLは検索の範囲とindex状況を見れます
・PARTITION BY RANGE (TO_DAYS(created))場合
検索の範囲はPARTITION p201005

・PARTITION BY RANGE (unix_timestamp(created))
検索の範囲は全部のPartition

原因はまだ分からないけど、気を付けってください。

作成編が完成、今度はBenchMark編