mita2 database life

主にMySQLに関するメモです

MySQL ALTER TABLEとその影響まとめ

MySQLの初期のALTER TABLEの実装は非常にシンプルな実装でした。 新しいテーブル定義で(内部的に)一時テーブルを作成し、そこに既存のデータをコピーして、コピーが終わったら入れ替えます。コピー中は更新をブロックします。

MySQL v5.6 で オンラインDDL がサポートされ、更新がブロックされなくなりました。 また、v8.0 では、INSTANT ADD COLUMN が登場し、カラム追加が一瞬できるようになりました。

このように MySQLDDLは進化を続けてきたのですが、全ての ALTER TABLE で新機能が使えるわけではありません。 マニュアルには○×の記載があるのですが、早見表のようなものが欲しかったので、まとめてみました。

早見表

v5.7 のマニュアルをベースに、DDLの挙動をまとめました。v8.0でDDLまわりは大きく改善されているので、v8.0では違うかもしれないです。

dev.mysql.com

○×項目は4種類あります。単純に組み合わせると12パターンになるのですが、各項目はお互いに関連しているため、整理すると6パターンでした。

f:id:mita2db:20200821195517p:plain

各項目の解説

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 PlaceRebuilds Table は必ず No です。また、 Permits Concurrent DML は必ず Yes です。

Only Modifies Metadata が Yes のものは、削除やリネームなど、既存のデータを書き換え・参照する必要のないオペレーションが該当しています。