元ドキュメント: Online DDL
Online DDL
概要
Online DDL(Online Data Definition Language)は、テーブル構造の変更中も読み書き操作をブロックせずに継続できる機能です。テーブルロック時間を最小化し、データベースの高可用性を維持します。
TDSQL Boundless のような分散データベースでは、DDL 操作を複数のノードで同時に実行する必要があるため、以下の要件を満たす必要があります。
- DDL と DML の並行実行時の安全性
- 高い実行パフォーマンスと効率性
- クラッシュセーフ機構
主要機能
- 機能性: ほとんどのシナリオで Online DDL をサポート
- パフォーマンス(Fast Online DDL): 並列処理とバイパス書き込みにより DDL 操作を高効率化
- 互換性: ネイティブ MySQL のパーティションテーブル構文と 100% 互換。一次および二次パーティションに対応
実行方式
Online DDL は以下の 3 つの方式をサポートします。
| 方式 | 説明 |
|---|---|
| Copy | テーブルのコピーを作成し、データを移行した後に切り替え |
| Instant | メタデータのみを変更。データの移動なし |
| Inplace | テーブルの再構築を伴わず、テーブルを直接変更 |
使用例
sql
-- テストテーブルの作成
CREATE TABLE sbtest1 (id INT PRIMARY KEY, v1 INT);
-- テストデータの挿入
INSERT INTO sbtest1 (id, v1) VALUES (1, 1), (2, 2), (3, 3);
-- Online でのインデックス追加
ALTER TABLE sbtest1 ADD INDEX idx_v1(v1);
-- Online でのカラム追加
ALTER TABLE sbtest1 ADD COLUMN v2 INT;大規模テーブルのベストプラクティス
Fast Online DDL の効率は適切なパーティショニングに大きく依存します。大規模テーブルが適切にパーティショニングされていない場合、データが単一ノードに集中し、DDL が並列ではなくシリアルに実行される可能性があります。
推奨事項
- Hash / Key パーティションの使用: 大規模テーブルの容量問題や高並行アクセスのパフォーマンス問題に対応。データと読み書き負荷を複数ノードに均等に分散
- 適切なパーティションキーの選択: 大部分のコアビジネスクエリを満たすフィールドを選択
- パーティション数: インスタンスのノード数の倍数に設定
- データクリーンアップ:
RANGEパーティションとTRUNCATE PARTITIONコマンドで高速データクリーンアップを実現。分散環境ではRANGEと二次HASHパーティションの組み合わせを推奨
設定パラメータ
| パラメータ名 | デフォルト | 説明 |
|---|---|---|
tdsql_ddl_fillback_mode | ThomasWrite | データバックフィルに使用するアルゴリズム。ThomasWrite(古い書き込みを無視)/ IngestBehind(Bulk Load ベース) |
max_parallel_ddl_degree | 8 | データバックフィルフェーズの最大並列度。値を大きくすると速度が向上するが、CPU・I/O・メモリ消費が増加 |