起因
出於於性能考慮,生產上採用冷熱庫的方式,熱庫中保存最近的數據,每隔一段時間自動備份到冷庫中並從熱庫中刪除。但時間久了之後,就會發現磁盤佔用量越來越大。主要原因就是delete語句只是將記錄的位置標記爲“可複用”,但磁盤空間並不會直接回收。
解決方案
使用optimize table命令可以解決此問題,optimize table可以提高查詢性能、減少數據碎片,如:
optimize table userinfo;
我們可以通過:
show table status from mydb like 'userinfo'
來查看,其中的data_free即爲碎片空間,optiomize table主要進行了一下幾個步驟:
- 創建臨時表:與原表結構相同;
- 複製數據:將原表數據複製到臨時表中;
- 優化數表:複製時,MySQL會重新整理和重組數據,去除碎片,提高數據連續性;
- 重命名錶:將臨時表重命名爲原表。
不過,僅InnoDB和MyISAM引擎支持該語句。同事需要注意的是optimize table可能會導致鎖表和資源搶佔,所以不建議在業務高峯期處理。