使用DELETE語句刪除數據時,只是將記錄的位置或者數據頁標記為可復用,但是存儲空間中文件的大小不會改變,即表空間不會直接被回收。此時,您可以通過執行OPTIMIZE TABLE命令或DMS工具來回收表空間。
使用DMS工具或OPTIMIZE TABLE命令均可以回收表空間,兩種方式的各自特點如下表所示。通常情況下,在業務低峰期且希望執行效率高時,可以優先選擇使用OPTIMIZE TABLE命令來回收表空間。若您希望盡可能地降低對集群負載的影響且對執行效率不敏感時,可以優先選擇使用DMS工具來回收表空間。
回收表空間的方式 | 對比項 | ||
是否允許并發讀寫 | 執行速度 | 是否支持限流 | |
是 | 快 | 否 | |
是 | 慢 | 是 |
如需了解更多關于回收表空間的內容,請搜索釘釘群號加群進行咨詢。釘釘群號:15375044501。
前提條件
集群的數據庫引擎為InnoDB,且表中不包含全文索引。
注意事項
當目標表的碎片率較低時,執行OPTIMIZE TABLE命令不能顯著降低表空間大小。您可以通過
information_schema.tables
中的DATA_FREE
字段來查看目標表的碎片率。執行OPTIMIZE TABLE語句時,表數據會復制到新建的臨時表中,會臨時增加集群的存儲空間使用率。
對于不包含全文索引的表,OPTIMIZE TABLE語句使用Online DDL方式執行,允許并發讀寫。
對大表執行OPTIMIZE TABLE操作會帶來突發的IO和Buffer使用量,可能會導致鎖表和搶占資源,在業務高峰期執行該操作可能會導致集群不可用以及監控斷點。建議在業務低峰期執行該操作。
操作步驟
通過OPTIMIZE TABLE命令回收表空間
執行以下命令,回收表空間。
OPTIMIZE TABLE [$Database1].[Table1],[$Database2].[Table2]
其中,[$Database1]和[$Database2]為數據庫名稱,[Table1]和[Table2]為表名。
在InnoDB引擎中執行OPTIMIZE TABLE語句時,會出現以下提示信息,該信息是正常返回的結果,您可以忽略該信息,確認返回ok即可。關于更多OPTIMIZE TABLE語句的詳細信息請參見OPTIMIZE TABLE Statement。
Table does not support optimize, doing recreate + analyze instead
通過DMS回收表空間
- 登錄PolarDB控制臺。
- 在控制臺左上角,選擇集群所在地域。
- 找到目標集群,單擊集群ID。
單擊頁面右上角的登錄數據庫。
在左側選擇目標集群ID,雙擊目標庫,右鍵單擊任意表名,然后選擇批量操作表。
勾選需要釋放空間的表名,選擇表維護>優化表。
在彈出的優化表對話框中,確認優化信息無誤后,單擊確認。