MySQL ALTER TABLEとその影響まとめ
MySQLの初期のALTER TABLEの実装は非常にシンプルな実装でした。 新しいテーブル定義で(内部的に)一時テーブルを作成し、そこに既存のデータをコピーして、コピーが終わったら入れ替えます。コピー中は更新をブロックします。
MySQL v5.6 で オンラインDDL がサポートされ、更新がブロックされなくなりました。 また、v8.0 では、INSTANT ADD COLUMN が登場し、カラム追加が一瞬できるようになりました。
このように MySQL の DDLは進化を続けてきたのですが、全ての ALTER TABLE
で新機能が使えるわけではありません。
マニュアルには○×の記載があるのですが、早見表のようなものが欲しかったので、まとめてみました。
早見表
v5.7 のマニュアルをベースに、DDLの挙動をまとめました。v8.0でDDLまわりは大きく改善されているので、v8.0では違うかもしれないです。
○×項目は4種類あります。単純に組み合わせると12パターンになるのですが、各項目はお互いに関連しているため、整理すると6パターンでした。
各項目の解説
In Place
In Place
が Yes の場合、既存のデータファイルに対して変更や追記を行うことで、定義変更を行います。
No の場合、上記で説明した初期実装の動きになり、対象のテーブルと同じ空き容量が ALTER TABLE
するために必要になります。
Rebuilds Table
Rebuilds Table
は データの再編を行うかどうかを表します。
Rebuilds Table
が No の場合は、既存のデータブロックにはタッチせず、差分だけ既存のデータファイルに追記します。
- In Place が Yes / Rebuilds Table が Yes
- 既存のデータファイルを書き換えて再構築する
- In Place が Yes / Rebuilds Table が No
- 既存のデータファイルに追記する
- In Place が No / Rebuilds Table が Yes
- データを新定義のテーブルへコピーし、データを再編する
- In Place が No / Rebullds Table が No
- 該当なし(ファイルコピーの場合は必ず、データの再編となるため、ありえない)
Permits Concurrent DML
オンラインでDDLが実行できるかどうかです。Yes の場合、ALTER中に該当テーブルに対して更新を行うことができます。 No の場合、更新はブロックされ待たされます。
Only Modifies Metadata
この覧が Yes の場合、テーブルのデータにはタッチせず、メタデータの変更のみで ALTER TABLE
が完結します。そのため、一瞬で、ALTER TABLE
が完了します。
データファイル本体にはタッチしないため In Place
と Rebuilds Table
は必ず No です。また、 Permits Concurrent DML
は必ず Yes
です。
Only Modifies Metadata
が Yes のものは、削除やリネームなど、既存のデータを書き換え・参照する必要のないオペレーションが該当しています。