MySQL で ALTER TABLE に対して ALGORITHM, LOCK を明示的に指定しない場合
はじめに
MySQL で ALTER TABLE ( Index 追加など ) を行う際に、オンライン DDL で実行できるのかどうか?を調べることが多いと思います。
ALGORITHM=INPLACE, LOCK=NONE
を指定して実行することができれば、オンライン DDL で実行することができるのですが、指定しない場合はどうなるのか気になったので調べました。
MySQL バージョン: 8.0.30
ALGORITHM を指定しない場合の挙動
公式ドキュメントからの引用
The ALGORITHM clause is optional. If the ALGORITHM clause is omitted, MySQL uses ALGORITHM=INSTANT for storage engines and ALTER TABLE clauses that support it. Otherwise, ALGORITHM=INPLACE is used. If ALGORITHM=INPLACE is not supported, ALGORITHM=COPY is used.
指定しない場合は INSTANT
-> INPLACE
-> COPY
の順で、使用できるものから選ばれるみたいです。
例えば INDEX 追加の場合は INPLACE
が自動的に選ばれます。
LOCK=NONE を指定しない場合の挙動
これに関する正確な記述を見つけることができなかったのですが、公式ドキュメントでは以下のように記載されていました。
Permits as much concurrency as possible (concurrent queries, DML, or both). Omitting the LOCK clause is the same as specifying LOCK=DEFAULT.
Use this clause when you do not expect the default locking level of the DDL statement to cause any availability problems for the table.
LOCK 句を省略する場合は LOCK=DEFAULT
と同様の挙動となり、可能な限りの同時実行を許可すると記載されています。
ロックに関しては NONE
-> SHARED
-> EXCLUSIVE
の順で並列操作に対する制限が厳しくなるため、おそらくですが、可能な限りこの順番で使用できるものから選ばれるようです。
例えば INDEX 追加の場合は NONE
と同様の挙動になると思われます。
まとめ
あえて ALGORITHM, LOCK
を省略する必要はないですが、何らかのツールで DDL を行なっている場合など、省略せざるを得ない場面に遭遇した際にお役に立てれば光栄です🙇
Discussion