MySQL5.0 で数億レコードあるテーブルの定義変更をしたい
あるプロジェクトで、がっちがちに正規化されているテーブルの設計を一部崩して、テーブルにカラム&インデックスを追加する必要があり、というか一度追加してみたのだが、まったく終了する気配がなくていったん kill して今困ってるところである。
とりあえずやったみたこと
最初にやってみた方法は、alter table を使ってカラム&インデックスを追加。
テスト用 DB(レコード数はおよそ1億)であれば帰宅前にコマンドを実行して、出社時には終わっているので、本番用 DB でも多分いけるだろうと判断してやってみたが、これが大きな失敗。
本番用 DB では、レコード数がおよそ5億5千万もある巨大なテーブルということもあり、15時間くらいかかってもカラム追加すら終わっていないで、こりゃ困ったという感じ。
社内システムということもあり、力技で乗り切ろうとしたんだけど、やっぱりちゃんとしないといけないっすね。
大まかな作業案
- テーブルを定義をしなおして mysqldump でダンプしたのをリストアする
- テーブルを定義をしなおして insert into select ... で insert する
- 時間がかかるのを承知の上で alter table でテーブル定義を変更する
とりあえず色々ググって調べてみたり、テスト用 DB で実験して速度や負荷の計測をしたりしよう。Oracle なら SQL*Loader で解決しそうな気もするが、MySQL ではこの辺どないするのがいいんやろう。まぁそもそも設計がおかしいというのもあるけど、テーブル定義を変更するコストが、高いことがあらためて実感できたことはプラスですね。