DELETE ステートメントを使用して大規模な MySQL テーブルからデータを削除しても、ディスク領域はすぐには解放されません。代わりに、データベースはレコードまたはデータページを 再利用可能 としてマークするだけです。テーブルスペースを再利用し、ディスク使用量を削減するには、OPTIMIZE TABLE ステートメントを実行します。
前提条件
-
OPTIMIZE TABLEステートメントは、InnoDB および MyISAM ストレージエンジンでのみサポートされています。 -
インスタンスの使用可能なディスク領域は、最適化するテーブルのサイズ 以上 である必要があります。
使用上の注意
-
最初に大量のデータを削除:
DELETEステートメントで大量のデータを最初に削除しない限り、OPTIMIZE TABLEを実行してもテーブルスペースの使用量を削減する効果はありません。 -
ディスク領域使用量の一時的な増加:
OPTIMIZE TABLEを実行すると、再編成されたデータを格納するための一時テーブルが作成され、ディスク領域の使用量が一時的に増加します。操作が完了すると、一時テーブルは削除され、ディスク領域の使用量は通常の状態に戻ります。 -
再利用後、テーブルとインデックスの統計は変更されない可能性: ディスク領域は解放されますが、テーブルの統計がすぐに更新されない場合があります。詳細については、「OPTIMIZE TABLE を実行した後、ApsaraDB RDS for MySQL インスタンスのストレージ使用量が変更されないのはなぜですか?」をご参照ください。
-
ピーク時間中のパフォーマンスへの影響とリスク: 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 ステートメント」をご参照ください。Table does not support optimize, doing recreate + analyze instead
-
DMS の使用
-
左側のナビゲーションペインで、対象のインスタンスのインスタンス ID を選択し、対象のデータベースをダブルクリックし、任意のテーブル名を右クリックして、[テーブルの一括操作] を選択します。
-
領域を解放するテーブルを選択し、 を選択します。

-
表示されるダイアログボックスで、情報が正しいことを確認し、[OK] をクリックします。