質問: PHP+mysqlでwebサービス稼働中なのですが、更新クエリ(トランザクション)が多く発行されるテーブルに対し日中、ALTER TABLEでカラム1件を追加したところ、DB負荷が高まりサイトアクセスできなくなり、mysqlを再起動せざるを得ない状態となりました。 漢のコンピュータ道氏のサイトによりますと以下のように書かれてあり、これは負荷かかるだろうなと思いました。 > > まず結論から言うと、なんとMySQLのALTER > > TABLEはテーブルのデータを全てコピーし直すのである。なんて無駄なことを!?と思うかも知れないが、テーブル定義(スキーマ)の変更を動的に行うには、ストレージエンジンによるサポートが必要であり、動的なスキーマ変更をサポートしているストレージエンジンはまだ少ないのである。 > > > みなさんはサービス稼働中のサイトにどのようにALTER TABLEを実行していますか? サービスを止めたりしていますか?または深夜に行う等 ■バージョン情報 バージョン:5.1.73 ストレージエンジン:INNODB
回答: バージョンは、 8.0.12~ になってしまいますが、 instant add column という機能が追加されたようです。 これは何かというと、 DDL 実行時に InnoDB は変更せず、 MySQL 8 から導入された(たしか) Data Dictionary のメタデータだけを更新することで、 ADD COLUMN 等、一部の DDL を一瞬で終わらせる仕組みの様子です。 ``` -- https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html#online-ddl-column-operations ALTER TABLE t1 ADD COLUMN c2 INT, ADD COLUMN c3 INT, ALGORITHM=INSTANT; ``` また、日本語の解説としては、以下のページを発見しています。 また、 8 までいかなくても、 5.6 ぐらいから、 INPLACE の ADD COLUMN もできるようになっている様子です。これは、 add column をしている最中でも、参照や更新をできるようにするための仕組みの様子です。 なので、8 までいかないにせよ、 MySQL のバージョンをあげることで、解決可能な問題であるようだ、と思っています。