元ドキュメント: DDL パフォーマンスチューニング
DDL パフォーマンスチューニング
概要
DDL(Data Definition Language)操作は、テーブル構造の変更を行う重要な操作ですが、実行方法によってはサービスへ大きな影響を与える可能性があります。本ドキュメントでは、TDSQL Boundless における DDL 操作のパフォーマンス改善手法と、大規模テーブルのスキーマ変更を最適化する方法について解説します。
悲観ロックの基本概念
DDL 操作のパフォーマンスを理解するためには、ロックの仕組みを把握することが重要です。
メタデータロック(MDL)
DDL 操作中は、テーブルのメタデータロック(MDL)が取得されます。MDL は、DDL 操作とDML 操作の整合性を保証します。
- MDL 読み取りロック — SELECT や DML 操作時に自動的に取得される
- MDL 書き込みロック — DDL 操作時に取得される。読み取りロックと排他的
-- MDL ロックの状況確認
SELECT * FROM performance_schema.metadata_locks
WHERE OBJECT_TYPE = 'TABLE';DDL とロックの関係
| DDL の種類 | ロック方式 | DML への影響 |
|---|---|---|
| Instant DDL | MDL 書き込みロック(瞬時) | ほぼなし |
| Inplace DDL (Online) | 開始・終了時のみ MDL 書き込みロック | 最小限 |
| Copy DDL | 操作中 MDL 書き込みロック | DML がブロックされる |
DDL パフォーマンスの改善手法
1. Instant DDL の活用
対応している操作であれば、Instant DDL を最優先で使用してください。
-- Instant DDL 対応の操作例
-- カラムの追加(テーブル末尾)
ALTER TABLE table_name ADD COLUMN new_col INT, ALGORITHM=INSTANT;
-- デフォルト値の変更
ALTER TABLE table_name ALTER COLUMN col_name SET DEFAULT 100;2. Online DDL(Inplace)の使用
Instant DDL が使用できない場合は、Inplace DDL を使用します。
-- インデックスの追加
ALTER TABLE table_name ADD INDEX idx_col (col_name), ALGORITHM=INPLACE, LOCK=NONE;
-- カラムの型変更(一部対応)
ALTER TABLE table_name MODIFY COLUMN col_name VARCHAR(500), ALGORITHM=INPLACE, LOCK=NONE;3. MDL ロック待ちの回避
DDL 実行時に長時間実行中のトランザクションが存在する場合、MDL ロックの取得が遅延します。
-- DDL 実行前に長時間トランザクションを確認
SELECT
trx_id,
trx_state,
trx_started,
TIMESTAMPDIFF(SECOND, trx_started, NOW()) AS duration_sec,
trx_mysql_thread_id
FROM information_schema.innodb_trx
ORDER BY trx_started;
-- 必要に応じて DDL のタイムアウトを設定
SET lock_wait_timeout = 60;大規模テーブルのスキーマ変更
事前準備
- テーブルサイズの確認
SELECT
table_name,
ROUND((data_length + index_length) / 1024 / 1024 / 1024, 2) AS total_size_gb,
table_rows
FROM information_schema.tables
WHERE table_schema = 'your_database'
AND table_name = 'your_table';ディスク空き容量の確認 — Copy DDL の場合、テーブルサイズと同等の空き容量が必要
レプリケーション遅延の確認 — DDL 操作がレプリカに与える影響を事前に把握
実行時の推奨事項
低負荷時間帯に実行する
大規模テーブルの DDL は、以下のタイミングで実行することを推奨します。
- ピーク時間帯を避ける
- バッチ処理の実行時間帯を避ける
- メンテナンスウィンドウ内で実行する
複数の変更をまとめて実行する
-- 推奨:1回の ALTER TABLE で複数の変更を実行
ALTER TABLE large_table
ADD COLUMN col1 VARCHAR(100),
ADD COLUMN col2 INT DEFAULT 0,
ADD INDEX idx_col1 (col1);進行状況の監視
-- DDL の進行状況を確認
SELECT
EVENT_NAME,
WORK_COMPLETED,
WORK_ESTIMATED,
ROUND(WORK_COMPLETED / WORK_ESTIMATED * 100, 1) AS progress_pct
FROM performance_schema.events_stages_current
WHERE EVENT_NAME LIKE '%alter%';分散環境での DDL 最適化
ノード間の DDL 同期
TDSQL Boundless では、DDL 操作がクラスタ内の全ノードに伝播されます。以下の点に注意してください。
- DDL 完了時間は、最も遅いノードの処理時間に依存する
- ノード間のネットワーク遅延が DDL の全体時間に影響する
- DDL 実行中は、他の DDL 操作を同時に実行しないことを推奨する
Region への影響
大規模テーブルの DDL は、関連する Region のすべてに影響を与えます。Region 数が多いテーブルほど、DDL の完了に時間がかかる可能性があります。
トラブルシューティング
DDL がブロックされた場合
-- MDL ロック待ちの確認
SELECT
t.PROCESSLIST_ID,
t.PROCESSLIST_INFO,
ml.LOCK_TYPE,
ml.LOCK_STATUS
FROM performance_schema.metadata_locks ml
JOIN performance_schema.threads t ON ml.OWNER_THREAD_ID = t.THREAD_ID
WHERE ml.OBJECT_TYPE = 'TABLE'
AND ml.OBJECT_NAME = 'your_table';DDL のキャンセル
DDL の実行に問題が発生した場合、処理をキャンセルできます。
-- DDL を実行しているスレッドの特定
SHOW PROCESSLIST;
-- スレッドの強制終了
KILL <thread_id>;まとめ
DDL パフォーマンスの最適化では、Instant DDL の活用を最優先とし、MDL ロック待ちの回避と大規模テーブルへの事前準備を徹底してください。TDSQL Boundless の分散環境では、ノード間の同期と Region への影響も考慮に入れた計画的な DDL 実行が重要です。
詳細な仕様については、元ドキュメントをご参照ください。