首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL DELETE 刪除資料後磁碟空間不釋放?原因與 OPTIMIZE TABLE 回收空間實測

     編輯:MySQL 資料庫相關知識

執行 DELETE FROM table WHERE 條件 後,資料表佔用空間不減反增?這是 InnoDB/MyISAM 共同特性:DELETE 僅標記刪除旗標,不立即整理資料頁,空間標記為可重用但不歸還作業系統。

現象對比

語法資料空間
DELETE FROM t WHERE ...標記刪除不變(碎片化)
DELETE FROM t (無條件)全清歸零(MyISAM 立即釋放;InnoDB 需 TRUNCATE)
TRUNCATE TABLE t全清立即釋放(DDL、不可回滾)

解決方案:OPTIMIZE TABLE

OPTIMIZE TABLE 表名;

適用引擎:MyISAM、BDB、InnoDB(5.0+)。

MyISAM 額外效果

  • 修復刪除/分裂列導致的表損壞。
  • 索引頁未排序則重新排序。
  • 統計資訊過期則更新。

實測驗證

-- 大量刪除後
OPTIMIZE TABLE my_table;
-- 執行完成後,data_length + index_length 明顯下降,data_free 歸零
最佳實務:
• 定期維護視窗執行 OPTIMIZE TABLE(大表會鎖表,慎選時機)。
• InnoDB 可考慮 ALTER TABLE ... ENGINE=InnoDB 重建表達到同樣效果。
• 大量刪除優先用 TRUNCATE 或分批 DELETE ... LIMIT 1000 避免長鎖與巨大 Undo Log。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved