Skip to content

DDL パフォーマンスチューニング

概要

DDL(Data Definition Language)操作は、テーブル構造の変更を行う重要な操作ですが、実行方法によってはサービスへ大きな影響を与える可能性があります。本ドキュメントでは、TDSQL Boundless における DDL 操作のパフォーマンス改善手法と、大規模テーブルのスキーマ変更を最適化する方法について解説します。

悲観ロックの基本概念

DDL 操作のパフォーマンスを理解するためには、ロックの仕組みを把握することが重要です。

メタデータロック(MDL)

DDL 操作中は、テーブルのメタデータロック(MDL)が取得されます。MDL は、DDL 操作とDML 操作の整合性を保証します。

  • MDL 読み取りロック — SELECT や DML 操作時に自動的に取得される
  • MDL 書き込みロック — DDL 操作時に取得される。読み取りロックと排他的
sql
-- MDL ロックの状況確認
SELECT * FROM performance_schema.metadata_locks
WHERE OBJECT_TYPE = 'TABLE';

DDL とロックの関係

DDL の種類ロック方式DML への影響
Instant DDLMDL 書き込みロック(瞬時)ほぼなし
Inplace DDL (Online)開始・終了時のみ MDL 書き込みロック最小限
Copy DDL操作中 MDL 書き込みロックDML がブロックされる

DDL パフォーマンスの改善手法

1. Instant DDL の活用

対応している操作であれば、Instant DDL を最優先で使用してください。

sql
-- 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 を使用します。

sql
-- インデックスの追加
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 ロックの取得が遅延します。

sql
-- 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;

大規模テーブルのスキーマ変更

事前準備

  1. テーブルサイズの確認
sql
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';
  1. ディスク空き容量の確認 — Copy DDL の場合、テーブルサイズと同等の空き容量が必要

  2. レプリケーション遅延の確認 — DDL 操作がレプリカに与える影響を事前に把握

実行時の推奨事項

低負荷時間帯に実行する

大規模テーブルの DDL は、以下のタイミングで実行することを推奨します。

  • ピーク時間帯を避ける
  • バッチ処理の実行時間帯を避ける
  • メンテナンスウィンドウ内で実行する

複数の変更をまとめて実行する

sql
-- 推奨:1回の ALTER TABLE で複数の変更を実行
ALTER TABLE large_table 
    ADD COLUMN col1 VARCHAR(100),
    ADD COLUMN col2 INT DEFAULT 0,
    ADD INDEX idx_col1 (col1);

進行状況の監視

sql
-- 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 がブロックされた場合

sql
-- 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 の実行に問題が発生した場合、処理をキャンセルできます。

sql
-- DDL を実行しているスレッドの特定
SHOW PROCESSLIST;

-- スレッドの強制終了
KILL <thread_id>;

まとめ

DDL パフォーマンスの最適化では、Instant DDL の活用を最優先とし、MDL ロック待ちの回避と大規模テーブルへの事前準備を徹底してください。TDSQL Boundless の分散環境では、ノード間の同期と Region への影響も考慮に入れた計画的な DDL 実行が重要です。

詳細な仕様については、元ドキュメントをご参照ください。

Tencent Cloud プロダクトドキュメント