ALTER TABLE 文を実行する前に、その実行特性を事前に確認できます。この機能では、データベースエンジンが選択するアルゴリズム、テーブル全体の再構築が必要かどうか、同時実行可能な DML の有無、および未コミットのトランザクションによるブロッキングの可能性などを示します。これらの情報をもとに、ビジネスへの影響を評価し、DDL の実行タイミングおよび方法を判断してください。
サポートされるバージョン
EXPLAIN DDL は以下のバージョンで利用可能です。
PolarDB for MySQL 8.0.1(リビジョン 8.0.1.1.49 以降)
PolarDB for MySQL 8.0.2(リビジョン 8.0.2.2.27 以降)
制限事項
InnoDB ストレージエンジンを使用するテーブルのみ対応しています。
実際のデータは一切変更されません。
プライマリノードおよび読み取り専用ノードのいずれでも実行可能です。
Possible blocked MDLsフィールドに表示される潜在的なロック競合は、現在のノードにおけるものに限定されます。
EXPLAIN DDL の有効化
EXPLAIN DDL はデフォルトで有効です。以下のパラメーターで機能を制御できます。設定方法については、「クラスターおよびノードのパラメーターの設定」をご参照ください。
| パラメーター | レベル | 説明 | デフォルト値 |
|---|---|---|---|
loose_polar_enable_explain_ddl | グローバル | EXPLAIN DDL を有効または無効にします。有効な値: ON、OFF。 | ON |
loose_polar_max_collect_thd_num_in_explain_ddl | グローバル | 収集対象となる潜在的 MDL ブロッキングスレッドの最大数です。有効な値: 1~512。 | 16 |
構文
{ EXPLAIN | DESCRIBE | DESC } ALTER TABLE ...出力フィールド
ビジネスへの影響を直接決定する 4 つのフィールドがあります:Algorithm、Metadata Only、Rebuilt Table、および Concurrent DML。実行前にアクティブなロック競合を検出するには、Possible blocked MDLs をご活用ください。
| フィールド | 説明 | 値 |
|---|---|---|
Error No | エラーコードです。0 の場合、ステートメントは正常に実行されました。 | 0(成功)、またはエラーコード |
Algorithm | エンジンが使用するアルゴリズム。INSTANT は最も効率的です。COPY は最も効率が低く、書き込みをブロックします。 | INSTANT、INPLACE、COPY、Unknown |
Metadata Only | 操作がテーブルデータではなくメタデータのみを変更するかどうかを示します。メタデータのみの操作は、テーブルサイズに関係なく数秒で完了します。 | Yes、No、Unknown |
Rebuilt Table | 操作がテーブル全体の再構築を必要とするかどうかを示します。大規模テーブルの再構築には時間がかかります。 | Yes、No、Unknown |
Parallel Support | 操作が並列 DDL をサポートして処理を高速化できるかどうかを示します。 | Yes、Yes, But Not Enabled、Not Needed、No、Unknown |
Parallel Degree | DDL 操作で使用されるスレッド数です。-1 は「不明」を意味します。 | -1(不明)、1~128 |
Concurrent DML | DDL 実行中に読み取りおよび書き込み操作が許可されるかどうかを示します。 | Yes、No、Unknown |
Possible blocked MDLs | DDL をブロックする可能性のある未コミットトランザクションを持つ接続のプロセス ID です。 | カンマ区切りのプロセス ID、または空欄 |
Error Msg | Error No に対応するエラーメッセージです。 | 文字列 |
Suggest Info | 並列 DDL の有効化やロック競合の解消など、最適化に関する提案です。 | 文字列 |
Statement | 解析対象の DDL ステートメントです。 | DDL ステートメント |
アルゴリズムの効率順位
3 つのアルゴリズムは効率性の階層構造を形成しており、EXPLAIN DDL はエンジンが実際に選択した、その操作でサポートされる最も効率的なアルゴリズムを報告します。
| アルゴリズム | テーブル再構築 | 同時実行可能な DML | 効率性 |
|---|---|---|---|
INSTANT | いいえ | はい | 最高 — 数秒で完了 |
INPLACE | 操作内容により異なる | はい | 中 — 大規模テーブルでは数分かかる場合あり |
COPY | はい | 不可 | 最低 — 書き込みをブロック;ピーク時刻の実行は避けてください |
操作リファレンス
特定の操作に対して EXPLAIN DDL を実行する前に、ビジネスへの影響を概算するために本表をご活用ください。本表は一般的な動作を反映したものであり、実際の環境での結果を確認するには、必ず EXPLAIN DDL を実行してください。
| 操作 | アルゴリズム | メタデータのみ | テーブル再構築 | 同時実行可能な DML | 典型的な影響 |
|---|---|---|---|---|---|
| カラムの追加 | INSTANT | Yes | No | Yes | 数秒で完了;影響は最小限 |
| テーブル名の変更 | INPLACE | Yes | No | Yes | 迅速に完了;影響は最小限 |
| セカンダリインデックスの追加 | INPLACE | No | No | Yes | 所要時間はテーブルサイズに依存;影響は小さい |
| テーブルの再構築 | INPLACE | No | Yes | Yes | 多大なリソースを消費;非ピーク時刻に実行してください |
| カラム型の変更 | COPY | No | Yes | No | 書き込みをブロック;非ピーク時刻に実行してください |
例
実行特性の確認
以下の例では、DDL 操作がビジネスの可用性に与える影響を評価するために EXPLAIN DDL を使用する方法を示します。
すべての例で、同一のテストテーブルを使用します。
SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL,
`b` char(1) DEFAULT NULL,
`c` char(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)カラムの追加
EXPLAIN ALTER TABLE t1 ADD COLUMN d INT;*************************** 1. row ***************************
Error No: 0
Algorithm: INSTANT
Metadata Only: Yes
Rebuilt table: No
Parallel Support: Not Need
Parallel Degree: 1
Concurrent DML: Yes
Possible blocked MDLs:
Error Msg:
Suggest Info:
Statement: EXPLAIN ALTER TABLE t1 ADD COLUMN d int
1 row in set (0.00 sec)INSTANT アルゴリズムは、テーブル再構築を伴わずメタデータのみを変更し、同時実行可能な DML を許可します。この操作は数秒で完了し、ビジネスへの影響は最小限です。
テーブル名の変更
EXPLAIN ALTER TABLE t1 rename t1_rn;*************************** 1. row ***************************
Error No: 0
Algorithm: INPLACE
Metadata Only: Yes
Rebuilt table: No
Parallel Support: Not Need
Parallel Degree: 1
Concurrent DML: Yes
Possible blocked MDLs:
Error Msg:
Suggest Info:
Statement: EXPLAIN ALTER TABLE t1 rename t1_rn
1 row in set (0.01 sec)INPLACE アルゴリズムは、テーブル再構築を伴わずメタデータのみを変更し、同時実行可能な DML を許可します。この操作はビジネスへの影響が最小限です。
カラム型の変更
EXPLAIN ALTER TABLE t1 modify COLUMN a char(1);*************************** 1. row ***************************
Error No: 0
Algorithm: COPY
Metadata Only: No
Rebuilt table: Yes
Parallel Support: No
Parallel Degree: 1
Concurrent DML: No
Possible blocked MDLs:
Error Msg:
Suggest Info:
Statement: EXPLAIN ALTER TABLE t1 modify COLUMN a char(1)
1 row in set (0.01 sec)COPY アルゴリズムは、テーブル全体の再構築を必要とし、同時実行可能な DML をブロックします。この操作はビジネスに大きな影響を与えるため、非ピーク時刻に実行してください。
テーブルの再構築
EXPLAIN ALTER TABLE t1 engine= innodb;*************************** 1. row ***************************
Error No: 0
Algorithm: INPLACE
Metadata Only: No
Rebuilt table: Yes
Parallel Support: Yes But Not Enable
Parallel Degree: 1
Concurrent DML: Yes
Possible blocked MDLs:
Error Msg:
Suggest Info: 1. This DDL operation could use Parallel DDL to speed up.
Statement: EXPLAIN ALTER TABLE t1 engine= innodbINPLACE アルゴリズムはテーブル全体の再構築を必要としますが、同時実行可能な DML を許可します。読み取りおよび書き込みをブロックしませんが、大規模テーブルの再構築には多大なリソースを消費するため、非ピーク時刻に実行してください。
Suggest Info フィールドには、並列 DDL を使用することでこの操作を高速化できることが示されています。詳細については、「並列 DDL のサポート状況の確認」をご参照ください。並列 DDL のサポート状況の確認
PolarDB for MySQL では、DDL 操作の高速化のために並列 DDL をサポートしています。Parallel Support および Parallel Degree フィールドを確認することで、対象の操作が並列 DDL の恩恵を受けるかを判断できます。
Parallel Supportの値がYes, But Not Enabledの場合、その操作は並列 DDL をサポートしていますが、クラスター上で機能が有効化されていません。Suggest Infoフィールドには「This DDL operation could use Parallel DDL to speed up.」と表示されます。並列 DDL を有効化するには、「並列 DDL」をご参照ください。Parallel Supportの値がYesの場合、機能は有効化されており、実際に使用されています。EXPLAIN DDL は、現在のクラスターのワークロードに基づいて最適な並列処理の次数も推奨します。Suggest Infoフィールドには「This DDL operation can be accelerated by increasing the value of 'innodb_polar_parallel_ddl_threads'. The recommended value is 8.」と表示されます。推奨値に従ってinnodb_polar_parallel_ddl_threadsを調整し、パフォーマンスを向上させてください。
例:並列 DDL が無効の場合
並列 DDL が有効化されているかを確認します。
MySQL [test]> SHOW variables LIKE "%parallel_ddl_threads%";
+----------------------------------------------------+-------+
| Variable_name | Value |
+----------------------------------------------------+-------+
| innodb_polar_innovate_default_parallel_ddl_threads | 1 |
| innodb_polar_parallel_ddl_threads | 1 |
+----------------------------------------------------+-------+
2 rows in set (0.03 sec)並列 DDL は有効化されていません。セカンダリインデックスの追加操作について EXPLAIN を実行します。
EXPLAIN ALTER TABLE t1 ADD index k_a(a);*************************** 1. row ***************************
Error No: 0
Algorithm: INPLACE
Metadata Only: No
Rebuilt table: No
Parallel Support: Yes But Not Enable
Parallel Degree: 1
Concurrent DML: Yes
Possible blocked MDLs:
Error Msg:
Suggest Info: 1. This DDL operation could use Parallel DDL to speed up.
Statement: EXPLAIN ALTER TABLE t1 ADD index k_a(a)
1 row in set (0.01 sec)Parallel Support: Yes But Not Enabled は、その操作が並列 DDL を使用可能であるが、機能が有効化されていないことを意味します。並列 DDL を有効化することで、処理を高速化できます。
例:並列 DDL が有効の場合
並列処理の次数を 2 に設定します。
MySQL [test]> SET innodb_polar_parallel_ddl_threads = 2;
Query OK, 0 rows affected (0.00 sec)同じセカンダリインデックスの追加操作について EXPLAIN を実行します。
EXPLAIN ALTER TABLE t1 ADD index k_a(a);*************************** 1. row ***************************
Error No: 0
Algorithm: INPLACE
Metadata Only: No
Rebuilt table: No
Parallel Support: Yes
Parallel Degree: 2
Concurrent DML: Yes
Possible blocked MDLs:
Error Msg:
Suggest Info: 1. This DDL operation can be accelerated by increasing the value of 'innodb_polar_parallel_ddl_threads'. The recommended value is 8.
Statement: explain ALTER TABLE t1 ADD index k_a(a)
1 row in set (0.01 sec)Parallel Support: Yes および Parallel Degree: 2 は、操作が 2 つの並列スレッドで実行されていることを確認できます。現在のクラスターのワークロードが低いことから、Suggest Info では、さらなるパフォーマンス向上のために並列処理の次数を 8 に増やすよう推奨しています。
MDL ブロッキングの検出
テーブルに対する DDL 操作は、同一テーブル上のメタデータロック(MDL)を保持している未コミットトランザクションによってブロックされることがあります。極端なケースでは、検出されない MDL ブロッキングが接続の滞留やクラスターの不安定化を引き起こす可能性があります。Possible blocked MDLs フィールドを活用して、DDL 実行前にブロッキング接続を特定してください。
ブロッキングが存在する場合、Possible blocked MDLs には、未コミットトランザクションを持つ接続のプロセス ID が一覧表示されます。KILL または KILL QUERY を使用してそれらの接続を終了し、DDL のブロッキングを解除してください。
例:MDL ブロッキングの検出
接続 1 で、t1 に対するトランザクションを開始し、コミットせずにそのままにします。
MySQL [test]> begin;
Query OK, 0 rows affected (0.00 sec)
MySQL [test]> select * from t1;
Empty set (0.00 sec)接続 2 で、t1 に対する EXPLAIN DDL を実行します。
EXPLAIN ALTER TABLE t1 engine= innodb;
*************************** 1. row ***************************
Error No: 0
Algorithm: INPLACE
Metadata Only: No
Rebuilt table: Yes
Parallel Support: Yes But Not Enable
Parallel Degree: 1
Concurrent DML: Yes
Possible blocked MDLs: 18
Error Msg:
Suggest Info: 1. This DDL operation may be blocked by the threads listed under 'Possible blocked MDLs'.
2. This DDL operation could use Parallel DDL to speed up.
Statement: EXPLAIN ALTER TABLE t1 engine= innodbPossible blocked MDLs: 18 は、接続 18 が未コミットトランザクションを持ち、この DDL をブロックすることを示しています。処理を継続する前に、KILL 18 または KILL QUERY 18 を実行して接続を終了してください。