執行 DELETE FROM table WHERE 條件 後,資料表佔用空間不減反增?這是 InnoDB/MyISAM 共同特性:DELETE 僅標記刪除旗標,不立即整理資料頁,空間標記為可重用但不歸還作業系統。
| 語法 | 資料 | 空間 |
|---|---|---|
DELETE FROM t WHERE ... | 標記刪除 | 不變(碎片化) |
DELETE FROM t (無條件) | 全清 | 歸零(MyISAM 立即釋放;InnoDB 需 TRUNCATE) |
TRUNCATE TABLE t | 全清 | 立即釋放(DDL、不可回滾) |
OPTIMIZE TABLE 表名;
適用引擎:MyISAM、BDB、InnoDB(5.0+)。
-- 大量刪除後 OPTIMIZE TABLE my_table; -- 執行完成後,data_length + index_length 明顯下降,data_free 歸零
最佳實務:
• 定期維護視窗執行OPTIMIZE TABLE(大表會鎖表,慎選時機)。
• InnoDB 可考慮ALTER TABLE ... ENGINE=InnoDB重建表達到同樣效果。
• 大量刪除優先用TRUNCATE或分批DELETE ... LIMIT 1000避免長鎖與巨大 Undo Log。