すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:OPTIMIZE TABLE を使用した MySQL テーブル領域の解放

最終更新日:Jun 25, 2026

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 およびバッファーリソースの消費が急増する可能性があります。これにより、テーブルロックやリソースの競合のリスクが生じます。ピーク時間帯に実行すると、インスタンスが利用できなくなったり、監視が中断されたりすることさえあります。したがって、ビジネスへの影響を避けるため、この操作はオフピーク時間帯に実行することを推奨します。

コマンドラインの使用

  1. クライアントを使用して ApsaraDB RDS for MySQL インスタンスに接続します

  2. ビジネス要件に基づいて、DELETE ステートメントを使用して不要なデータをクリーンアップします。

  3. 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 の使用

  1. DMS を使用して ApsaraDB RDS for MySQL インスタンスにログインします

  2. 左側メニューで、対象インスタンスの ID を選択し、対象データベースをダブルクリックし、任意のテーブル名を右クリックして、[テーブルの一括操作] を選択します。

  3. 領域を解放したいテーブルのチェックボックスを選択し、テーブルメンテナンス > 最適化テーブル を選択します。

  4. 表示されたダイアログボックスで変更内容を確認し、OK をクリックします。

関連ドキュメント

断片化したテーブル領域の解放

よくある質問

ディスク領域不変: OPTIMIZE TABLE

問題

ApsaraDB RDS for MySQL の公式ドキュメントの指示に従って大量のデータを削除し、OPTIMIZE TABLE を実行した後、information_schema.tables の DATA_FREE フィールドをクエリすると、値が更新されていないことがわかり、操作が失敗したと判断してしまうことがあります。

原因

ディスク領域は実際に解放されていますが、MySQL のテーブル統計情報が更新されていません。この問題は、ApsaraDB RDS for MySQL 5.6、5.7、および 8.0 (マイナーエンジンバージョンが 20250531 より前のもの) でよく見られます。これらのバージョンでは、OPTIMIZE TABLE を実行してもテーブルとインデックスの統計情報は自動的に更新されません。その結果、information_schema.tables の DATA_FREE 値は古い値のままとなり、実際の領域使用量を反映しません。詳細については、「Bug #117426: optimize table does not update table and index stats」をご参照ください。

ソリューション

ディスク領域が解放されない DELETE

ApsaraDB RDS for MySQL では、DELETE ステートメントを使用してデータを削除すると、レコードの場所またはデータページが 再利用可能 としてマークされるだけです。ディスクファイルは縮小せず、テーブル領域はすぐには解放されません。これにより、ストレージ領域の断片化が発生し、インスタンスのストレージを消費する可能性があります。

この問題を解決するには、ネイティブ DDL または DMS のロックフリーのスキーマ変更機能を使用できます。どちらの方法を使用する前にも、インスタンスに十分な空き領域があることを確認し、領域不足によるロックを防いでください

  • コマンドを使用した断片化領域の解放OPTIMIZE TABLEALTER TABLE <table_name> ENGINE=InnoDB; などの DDL 操作を実行して、テーブルデータとインデックス構造を再編成し、断片化された領域を解放します。

    重要

    ネイティブ DDL コマンドを使用する場合は、メタデータロックによるブロッキングを防ぐため、オフピーク時間帯に実行してください。詳細については、「注意事項」をご参照ください。

  • DMS のロックフリーのスキーマ変更を使用した断片化領域の解放: メタデータロックに関連する問題を回避するために、DMS のロックフリーのスキーマ変更機能を使用して、断片化したテーブル領域を解放できます。

TRUNCATE または DROP の後にディスク領域が解放されない

ApsaraDB RDS for MySQL で、TRUNCATE または DROP 操作を実行した後にディスク領域が解放されない場合は、次の手順に従ってください:

  1. 領域解放の確認

    TRUNCATE または DROP を実行した後、インスタンスのディスク使用量を監視して、領域が解放されたかどうかを確認してください。通常、ディスク使用量の減少は、インスタンスの総領域に対する削除されたテーブルのサイズを反映します。

  2. 古い情報に依存しない

    ApsaraDB RDS コンソール (自律型サービス > 診断 > 空間解析) または information_schema.tables を使用してテーブルサイズを確認した場合、データ更新の遅延により、テーブル領域は変わらないように見えることがあります。したがって、最終的な測定には、ディスク使用量のメトリクスを使用することを推奨します。

  3. 非同期削除の影響を理解する

    インスタンスで非同期削除機能 (Alibaba Cloud の大容量ファイルの非同期パージなど) が有効になっている場合、テーブルファイルが占有していた領域はすぐには解放されません。代わりに、バックグラウンドプロセスが徐々にクリーンアップします。ディスク領域が解放されるには、このプロセスが完了するのを待つ必要があります。