當MySQL表資料量較大時,通過 DELETE 語句清理資料並不會直接釋放磁碟空間,僅會將資料庫記錄或資料頁標記為可重用。若需要真正回收資料表空間並減少磁碟佔用,可通過OPTIMIZE TABLE實現。
前提條件
-
僅InnoDB和MyISAM引擎支援
OPTIMIZE TABLE語句。 -
執行個體剩餘磁碟空間必須大於等於需釋放表的空間。
注意事項
-
必須先刪除大量資料:如果未先通過
DELETE刪除大量資料,直接執行OPTIMIZE TABLE將無法有效降低資料表空間使用率。 -
磁碟空間佔用的短暫增加:執行
OPTIMIZE TABLE時,MySQL會建立一個暫存資料表來儲存重組後的資料,這會導致磁碟空間在短時間內增加。操作完成後,暫存資料表會被刪除,磁碟空間佔用會恢複正常。 -
釋放後表和索引的統計資訊可能沒變化:實際磁碟空間已釋放,但因MySQL表統計資訊未及時重新整理所致,詳情請參見執行OPTIMIZE TABLE後,RDS MySQL磁碟空間值沒變化。
-
效能影響與高峰期風險:在RDS MySQL 5.7和8.0 中,
OPTIMIZE TABLE使用Online DDL方式執行,支援並發DML操作。然而,對大表執行該操作可能引發突發的IO和Buffer資源佔用,存在鎖表或資源搶佔風險,業務高峰期還可能導致執行個體不可用或監控中斷。因此,建議選擇業務低峰期執行以避免對正常業務造成影響。 -
手動終止正在執行的OPTIMIZE TABLE:在用戶端(如MySQL命令列或DMS的SQL視窗)中按Ctrl+C只會斷開當前用戶端串連,不會終止後端正在執行的OPTIMIZE TABLE操作。如需終止該操作,需通過另一個資料庫連接執行
SHOW PROCESSLIST;查看線程列表,找到正在執行OPTIMIZE TABLE的線程ID,然後執行KILL <線程ID>;終止該線程。
通過命令列操作
-
使用
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,然後雙擊目標庫,按右鍵任意表名,然後選擇大量操作表。
-
勾選需要釋放空間的表名,然後選擇。
-
在彈出的對話方塊中確認變更資訊正確,然後單擊確認即可。