MySQL の大きなテーブルから DELETE ステートメントでデータを削除した場合、この操作ではディスク領域はすぐには解放されません。代わりに、データベースレコードまたはデータページが再利用可能としてマークされるだけです。実際にテーブル領域を解放してディスク使用量を削減するには、OPTIMIZE TABLE ステートメントを実行します。
前提条件
-
OPTIMIZE TABLEステートメントをサポートするのは、InnoDB と MyISAM ストレージエンジンのみです。 -
インスタンスには、最適化するテーブルのサイズ 以上 の利用可能なディスク領域が必要です。
注意事項
-
大量のデータを事前に削除:
DELETEを使用して大量のデータを事前に削除せずにOPTIMIZE TABLEを実行しても、テーブル領域の使用量を効果的に削減することはできません。 -
ディスク領域使用量の一時的な増加:
OPTIMIZE TABLEを実行すると、データ再編成用の一時テーブルが作成され、ディスク領域の使用量が一時的に増加します。操作が完了すると、一時テーブルは削除され、ディスク領域の使用量は正常に戻ります。 -
古い統計情報: ディスク領域は解放されますが、テーブルの統計情報が更新されていないため、この変更がすぐに表示されない場合があります。詳細については、「ApsaraDB RDS for MySQL インスタンスで OPTIMIZE TABLE を実行した後もディスク領域使用量が変わらないのはなぜですか?」をご参照ください。
-
ピーク時間帯におけるパフォーマンスへの影響とリスク: ApsaraDB RDS for MySQL 5.7 および 8.0 では、
OPTIMIZE TABLEはオンライン DDL 方式を使用し、同時 DML 操作をサポートします。ただし、大きなテーブルでこのステートメントを実行すると、I/O およびバッファーリソースの消費が急増する可能性があります。これにより、テーブルロックやリソースの競合のリスクが生じます。ピーク時間帯に実行すると、インスタンスが利用できなくなったり、監視が中断されたりすることさえあります。したがって、ビジネスへの影響を避けるため、この操作はオフピーク時間帯に実行することを推奨します。
コマンドラインの使用
-
ビジネス要件に基づいて、
DELETEステートメントを使用して不要なデータをクリーンアップします。 -
OPTIMIZE TABLEステートメントを実行して、テーブル領域を解放します。OPTIMIZE TABLE <$Database1>.<Table1>,<$Database2>.<Table2>;説明-
<$Database1> と <$Database2> はデータベース名、<Table1> と <Table2> はテーブル名です。
-
InnoDB ストレージエンジンを使用するテーブルで
OPTIMIZE TABLEステートメントを実行すると、次のメッセージが返されることがあります。これは想定内の動作です。このメッセージは無視し、操作で「OK」が返されることを確認してください。詳細については、「OPTIMIZE TABLE Statement」をご参照ください。Table does not support optimize, doing recreate + analyze instead
-
DMS の使用
-
左側メニューで、対象インスタンスの ID を選択し、対象データベースをダブルクリックし、任意のテーブル名を右クリックして、[テーブルの一括操作] を選択します。
-
領域を解放したいテーブルのチェックボックスを選択し、 を選択します。
-
表示されたダイアログボックスで変更内容を確認し、OK をクリックします。