2011-03-27
MySQL 日付別パーティショニングの運用
MySQL :: MySQL 5.1 リファレンスマニュアル :: 15 パーティショニング http://dev.mysql.com/doc/refman/5.1/ja/partitioning.html
実験的にやってみただけでノウハウとして固まってはいないのですが、現状の知識をまとめてみたいと思います。
前提
- MySQL 5.1以降
- 検証した環境は5.1.47
- 日付ごとにパーティショニング
- カラムは一意な"id"と作成日付の"created"があるとする
準備
- idとcreatedを複合でプライマリキーにする
- createdをTO_DAYS()してパーティショニングする
- 大枠と個別のパーティションの両方でTO_DAYS()する
- UNIX_TIMESTAMP()とどちらがいいのかは未検証
- 5.5からはDATETIME型のままできるとのこと
- TO_DAYS()した値は認識しづらいので、COMMENTで年月日がわかるようにしておく
- 運用開始時の取りうる日付から数日間先まで追加しておく
- 週単位/月単位/年単位のどれが適しているかは未検証
- バッファとしての VALUES LESS THAN MAXVALUE は使わない
- 新たなパーティションの追加ができなくなるため
- REORGANIZE PARTITIONで再配置できるが時間がかかる
SQL例
-- 大枠追加 ALTER TABLE table PARTITION BY RANGE (TO_DAYS(created)) (PARTITION p20110327 VALUES LESS THAN (TO_DAYS('2011-03-28 00:00:00')) COMMENT = '2011-03-28 00:00:00'); -- 値追加 ALTER TABLE table PARTITION ADD PARTITION (PARTITION p20110328 VALUES LESS THAN (TO_DAYS('2011-03-29 00:00:00')) COMMENT = '2011-03-29 00:00:00');
スキーマ例
-- SHOW CREATE TABLEの結果 CREATE TABLE `game_histories` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(10) unsigned NOT NULL, `score` int(10) unsigned NOT NULL, `created` datetime NOT NULL, PRIMARY KEY (`id`,`created`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 /*!50100 PARTITION BY RANGE (TO_DAYS(created)) PARTITION p20110327 VALUES LESS THAN (734589) COMMENT = '2011-03-28 00:00:00' ENGINE = InnoDB, PARTITION p20110328 VALUES LESS THAN (734590) COMMENT = '2011-03-29 00:00:00' ENGINE = InnoDB, PARTITION p20110329 VALUES LESS THAN (734591) COMMENT = '2011-03-30 00:00:00' ENGINE = InnoDB, PARTITION p20110330 VALUES LESS THAN (734592) COMMENT = '2011-03-31 00:00:00' ENGINE = InnoDB, PARTITION p20110331 VALUES LESS THAN (734593) COMMENT = '2011-04-01 00:00:00' ENGINE = InnoDB */
運用
- パーティションの削除
- 不要になったパーティションに対してDROP PARTITION
- パーティションの追加
- 先回りして追加しておく必要がある
- 対象となるパーティションが存在しない場合INSERTに失敗する
- cron自動実行
- n日おきにn個追加/削除というようなジョブを登録して実行
- 問題なく追加/削除できているかを確認する仕組みを作る
- パーティション自体が不要になったらREMOVE PARTITIONING
SQL例
-- 値削除 ALTER TABLE table DROP PARTITION p20110327; -- 大枠削除 ALTER TABLE table REMOVE PPARTITIONING; -- データ分布確認 SELECT table_schema, table_name, partition_name, partition_ordinal_position, table_rows FROM information_schema.partitions WHERE table_name = 'game_histories'; -- 刈り込み(pruning)確認 EXPLAIN PARTITIONS SELECT * FROM game_histories WHERE created < '2011-03-28 00:00:00';
参考リンク
以下の記事のおかげでできました。ありがとうございます!
- MySQLパーティショニングでパフォーマンスアップ! | QuickKnowLedge
- ソーシャルゲームのためのMySQL入門 - Technology of DeNA
- Range Partitioning と日付型の選び方 - Yet Another Hackadelic
- 今日の MySQL - Partitioning 編 - - Yet Another Hackadelic
- MySQLのパーティショニングのハマリ所 - sakaikの日々雑感〜(T)編
トラックバック - http://d.hatena.ne.jp/deeeki/20110327/mysql_partitioning_operation
リンク元
- 128 http://www.google.co.jp/url?sa=t&rct=j&q=mysql パーティション 追加&source=web&cd=7&ved=0CE4QFjAG&url=http://d.hatena.ne.jp/deeeki/20110327/mysql_partitioning_operation&ei
- 66 http://www.google.co.jp/url?sa=t&rct=j&q=mysql+パーティショニング+日付&source=web&cd=2&ved=0CCcQFjAB&url=http://d.hatena.ne.jp/deeeki/20110327/mysql_partitioning_oper
- 47 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCgQFjAA&url=http://d.hatena.ne.jp/deeeki/20110327/mysql_partitioning_operation&ei=UpBFT4a4JeaaiQf6u6GUAw&usg=AFQjCNEfFSUjVeATb-DBQqEKDeCEdoVbew&sig2=MySvKNc1etDsfYKUMAIVig
- 46 http://www.google.co.jp/url?sa=t&rct=j&q=パーティション mysql 現在日付&source=web&cd=4&ved=0CDMQFjAD&url=http://d.hatena.ne.jp/deeeki/20110327/mysql_p
- 34 http://www.google.co.jp/search?q=mysql+パーティショニング+確認&hl=ja&biw=813&bih=638&prmd=ivns&ei=aV-RTd-EM4S8cL3g3Uo&start=10&sa=N
- 21 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0CDUQFjAC&url=http://d.hatena.ne.jp/deeeki/20110327/mysql_partitioning_operation&ei=-cUzT_LtC8fLmAX3lNjpAQ&usg=AFQjCNEfFSUjVeATb-DBQqEKDeCEdoVbew&sig2=lATbmle8vamTLQ-8JouEuQ
- 18 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=mysql+パーティション クーロン
- 18 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cts=1331027032917&ved=0CC0QFjAB&url=http://d.hatena.ne.jp/deeeki/20110327/mysql_partitioning_operation&ei=XtxVT5bHHuTGmQXMgunlCQ&usg=AFQjCNEfFSUjVeATb-DBQqEKDeCEdoVbew&sig2=uaRgp
- 18 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cts=1331051511517&ved=0CEMQFjAD&url=http://d.hatena.ne.jp/deeeki/20110327/mysql_partitioning_operation&ei=8TtWT8TiLo-ZiAe1tYToCA&usg=AFQjCNEfFSUjVeATb-DBQqEKDeCEdoVbew&sig2=aSNlP
- 16 http://www.google.co.jp/url?sa=t&rct=j&q=mysql 日付 日単位&source=web&cd=2&ved=0CCQQFjAB&url=http://d.hatena.ne.jp/deeeki/20110327/mysql_partitioning_operation&ei=KY68Trf6EczHmQX5iMCKBA&usg=AFQjCNEf





