このトピックでは、最適化されたバッファプール管理メカニズムを提供する高速DDL機能について説明します。 このメカニズムにより、データ定義言語 (DDL) 操作の影響を軽減し、許可される同時DDL操作の数を増やすことができます。
前提条件
RDSインスタンスは、次のいずれかのMySQLバージョンを実行します。- MySQL 8.0 (20200630以降のマイナーエンジンバージョンを使用)
- MySQL 5.7 (20200630以降のマイナーエンジンバージョンを使用)
- MySQL 5.6 (20200630以降のマイナーエンジンバージョンを使用)
背景情報
DDL操作はRDSインスタンスで一般的です。 RDSインスタンスを使用すると、DDL操作に関連する問題が発生する可能性があります。 たとえば、次の問題が発生する可能性があります。
- インデックスを追加すると、パフォーマンスジッターが発生し、RDSインスタンスの読み取りおよび書き込み操作が中断されるのはなぜですか。
- サイズが1 GB未満のテーブルでDDL操作を実行するのに10分以上かかるのはなぜですか?
- 一時テーブルを生成する接続が閉じられると、なぜパフォーマンスジッタが発生するのでしょうか。
ApsaraDB for RDSのデータベースエンジンチームは、これらの問題を特定するために詳細な分析と集中的なテストを実施しました。 分析とテストの結果に基づいて、チームはDDL操作の管理に使用されるキャッシュメンテナンスロジックの欠陥を特定しました。 これらの問題を解決するために、チームはより高速なDDL機能を開発しました。 この機能によって提供される最適化されたバッファプール管理メカニズムにより、DDL操作によってトリガーされるロックの競合が軽減されます。 RDSインスタンスが通常の数のワークロードを処理する場合、DDL操作中にRDSインスタンスのパフォーマンスを確保できます。
より高速なDDLを有効にする
ApsaraDB for RDSコンソールでloose_innodb_rds_faster_DDLパラメーターをONに設定することで、より高速なddl機能を有効にできます。 詳細は、「インスタンスパラメーターの変更」をご参照ください。
DDL操作を使用したテスト
- テストシナリオ
インプレースアルゴリズムを使用して、MySQL 8.0でサポートされている次のステートメントを実行してオンラインDDL操作を実行します。CREATE INDEXおよびOPTIMIZE TABLE。 CREATE INDEXステートメントは、テーブルを再構築する必要なしに、テーブルにインデックスを作成します。 OPTIMIZE TABLEステートメントは、テーブルを再構築する必要があるテーブルにインデックスを作成します。
操作 インスタント インプレース 再構築テーブル 同時DML操作を許可 メタデータのみ変更 CREATE INDEX 任意 必須 任意 必須 任意 最適化テーブル 任意 必須 必須 必須 任意 - テストインスタンス
テストに使用されるRDSインスタンスは、MySQL 8.0を実行します。 8 CPUコアと64 GBのメモリを提供します。 DDL操作を実行するテーブルのサイズは600 MBです。
- テストの実行手順
SysBenchを使用してストレステストを実行します。 このテストでは、オンラインDDL操作を実行し、操作結果を比較します。
- テスト結果
操作 平均実行期間 (高速DDL無効) 平均実行期間 (高速DDLを有効にした場合) パフォーマンス向上時間 CREATE INDEX 56秒 4.9秒 11.4 最適化テーブル 220秒 17秒 12.9 - テスト概要
より高速なDDL機能により、ApsaraDB RDS for MySQLとAliSQLを使用することで、DDL操作の実行期間をMySQL Community Editionと比較して90% 以上短縮できます。
一時テーブルでのテスト
一時テーブルはMySQLで一般的です。 たとえば、information_schemaデータベースからテーブルを照会したり、複雑なSQL文の実行を促進したりするために使用される一時テーブルを作成します。 スレッドが終了すると、関連するすべての一時テーブルが削除されます。 これは、RDSインスタンスのパフォーマンスジッタを引き起こす特定のタイプのDDL操作と呼ばれます。 詳細については、「大BPでの切断stuck InnoDBでのTemp ibtテーブルスペースの切り捨て」をご参照ください。
- テストインスタンス
テストに使用されるRDSインスタンスは、MySQL 8.0を実行します。 8 CPUコアと64 GBのメモリを提供します。
- テストの実行手順
tpcc-mysqlを使用してストレステストを実行します。 このテストでは、クエリを実行して、バッファプールがほぼフル容量に達していることを確認します。 次に、一時テーブルを生成するために、短命の接続を介してシングルスレッド要求を開始します。
- テスト結果
比較アイテム DDL操作は含まれません より高速なDDL対応 より高速なDDL無効化 1秒あたりのトランザクション数 (TPS) 42,000 40,000 <10,000 ストレステストで得られた第2レベルのパフォーマンスデータを次の図に示します。 赤で強調表示された部分は、高速DDL機能が無効になっているときにRDSインスタンスでサポートされているTPSを示します。
- テスト概要
一時テーブルを生成するスレッドが終了するたびに、ネイティブMySQLは深刻なパフォーマンスジッターを引き起こします。 ジッタはTPSを70% 以上減少させる。 より高速なDDL機能が有効になった後、TPSの減少は5% に減少します。
最適化効果
より高速なDDL機能は、MySQL 5.6、5.7、および8.0をサポートします。 ただし、サポートされるDDL操作は、選択したMySQLバージョンによって異なります。
カテゴリ | DDL操作 | MySQL 5.6 | MySQL 5.7 | MySQL 8.0 |
インプレースDDL | 詳細については、「MySQL 8.0オンラインDDL操作」および「MySQL 5.7オンラインDDL操作」をご参照ください。 | 任意 | 必須 | 必須 |
テーブルスペース管理 | テーブルスペース暗号化を有効または無効にします。 | 任意 | 必須 | 必須 |
テーブルスペースを解放または削除します。 | 任意 | 必須 | 必須 | |
テーブルスペースを破棄します。 | 必須 | 必須 | 必須 | |
テーブルの削除 | テーブルを解放または削除します。 | 必須 | 必須 | 必須 |
元に戻す操作 | 元に戻すテーブルスペースを解放または削除します。 | 任意 | 任意 | 必須 |
テーブル更新 | テーブルとその汚れたページを更新します。 | 必須 | 必須 | 必須 |
より速いDDLによって修正された欠陥
より高速なDDL機能は、次の欠陥を修正します。