😎

MySQL で ALTER TABLE に対して ALGORITHM, LOCK を明示的に指定しない場合

2024/10/09に公開

はじめに

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