大規模な MySQL テーブルを扱う場合、DELETE ステートメントを実行しても、ディスク領域は直ちに解放されません。代わりに、データベースレコードまたはデータページを再利用可能としてマークするだけ です。テーブルスペースを再利用してディスク使用量を削減するには、OPTIMIZE TABLE コマンドを実行します。
前提条件
-
OPTIMIZE TABLEステートメントは、InnoDB および MyISAM ストレージエンジンでのみサポートされています。 -
インスタンスの使用可能なディスク領域は、最適化するテーブルのサイズ以上である必要があります。
注意事項
-
事前に大量のデータを削除:先に
DELETEを使用して相当量のデータを削除していない場合、OPTIMIZE TABLEを実行しても効果はありません。 -
ディスク領域の使用量が一時的に増加:
OPTIMIZE TABLEの実行時、MySQL は再編成したデータを格納するための一時テーブルを作成します。これにより、ディスク使用量が一時的に増加します。処理の完了後は一時テーブルが削除され、ディスク使用量は正常に戻ります。 -
領域の再利用後もテーブルおよびインデックス統計が変化しない場合がある:ディスク領域は再利用されますが、MySQL のテーブル統計は直ちに更新されない場合があります。詳細については、「OPTIMIZE TABLE の実行後も ApsaraDB RDS for MySQL インスタンスのディスク使用量が変わらないのはなぜですか?」をご参照ください。
-
ピーク時のパフォーマンス影響とリスク:ApsaraDB RDS for MySQL 5.7 および 8.0 では、
OPTIMIZE TABLEはオンライン DDL を使用し、同時 DML 操作をサポートします。ただし、大規模テーブルでこの操作を実行すると、I/O とバッファリソース消費が急増し、テーブルロックまたはリソースの競合が発生するリスクがあります。ピーク時には、インスタンスの利用不可や監視の中断につながることもあります。そのため、業務への影響を避けるために、この操作はオフピーク時に実施することを推奨します。 -
OPTIMIZE TABLE 操作の手動終了:MySQL コマンドラインツールや DMS SQL ウィンドウなどのデータベースクライアントで Ctrl+C を押しても、切断されるのは現在のクライアントセッションのみです。バックエンドで実行中の OPTIMIZE TABLE 操作は停止しません。操作を終了するには、別のデータベース接続を確立し、
SHOW PROCESSLIST;を実行して OPTIMIZE TABLE 操作のスレッド ID を確認してから、KILL <thread ID>;を実行して該当スレッドを終了します。
コマンドラインでの実行
-
業務要件に基づき、
DELETEステートメントを使用して不要なデータをクリーンアップします。 -
OPTIMIZE TABLEコマンドを実行してテーブルスペースを再利用します。OPTIMIZE TABLE <$Database1>.<Table1>,<$Database2>.<Table2>;説明-
<$Database1> と <$Database2> はデータベース名を表し、<Table1> と <Table2> はテーブル名を表します。
-
InnoDB テーブルで
OPTIMIZE TABLEを実行すると、次のメッセージが返されます。これは想定どおりの動作であり、無視できます。最終結果が "ok" の場合、操作は成功しています。詳細については、MySQL 公式ドキュメントの「OPTIMIZE TABLE Statement」をご参照ください。Table does not support optimize, doing recreate + analyze instead
-
DMS での実行
-
左側メニューで対象のインスタンス ID を選択し、データベースをダブルクリックしてから、対象テーブルを右クリックし、 [Batch operation table] を選択します。
-
最適化するテーブルを選択し、 を選択します。
-
ダイアログボックスの情報を確認し、 OK をクリックします。