MySQL5.0 で数億レコードあるテーブルの定義変更をしたい

あるプロジェクトで、がっちがちに正規化されているテーブルの設計を一部崩して、テーブルにカラム&インデックスを追加する必要があり、というか一度追加してみたのだが、まったく終了する気配がなくていったん kill して今困ってるところである。

とりあえずやったみたこと

最初にやってみた方法は、alter table を使ってカラム&インデックスを追加。

テスト用 DB(レコード数はおよそ1億)であれば帰宅前にコマンドを実行して、出社時には終わっているので、本番用 DB でも多分いけるだろうと判断してやってみたが、これが大きな失敗。

本番用 DB では、レコード数がおよそ5億5千万もある巨大なテーブルということもあり、15時間くらいかかってもカラム追加すら終わっていないで、こりゃ困ったという感じ。


社内システムということもあり、力技で乗り切ろうとしたんだけど、やっぱりちゃんとしないといけないっすね。

大まかな作業案

  1. テーブルを定義をしなおして mysqldump でダンプしたのをリストアする
  2. テーブルを定義をしなおして insert into select ... で insert する
  3. 時間がかかるのを承知の上で alter table でテーブル定義を変更する


とりあえず色々ググって調べてみたり、テスト用 DB で実験して速度や負荷の計測をしたりしよう。Oracle なら SQL*Loader で解決しそうな気もするが、MySQL ではこの辺どないするのがいいんやろう。まぁそもそも設計がおかしいというのもあるけど、テーブル定義を変更するコストが、高いことがあらためて実感できたことはプラスですね。