在MySQL資料庫日常維護中,REPAIR TABLE與OPTIMIZE TABLE是兩個關鍵指令,分別針對表損壞修復與空間回收優化。理解其適用場景與操作差異,對保障資料完整性與查詢效能至關重要。
適用對象:僅限 MyISAM 儲存引擎(InnoDB等事務型引擎通常透過崩潰恢復機制自動修復)。
使用語法:
REPAIR TABLE `table_name` [QUICK] [EXTENDED] [USE_FRM];
常用選項:
QUICK:僅修復索引樹,不掃描資料列,速度最快,適用於索引損壞但資料完整的情況。EXTENDED:逐列重建索引,耗時較長,可嘗試恢復更多資料,但可能產生「垃圾列」,作為最後手段。USE_FRM:當.MYI索引檔案遺失或檔頭損壞時,依據.frm定義檔重建索引。典型場景:伺服器異常關機、磁碟滿導致寫入中斷、索引檔案損壞報錯(如Can't find file: 'table.MYI')。
核心功能:
DELETE或UPDATE變長列(VARCHAR/TEXT/BLOB)後,磁碟空間不會立即釋放,OPTIMIZE會重組資料檔案(.MYD),釋放碎片空間。適用引擎:MyISAM、InnoDB(InnoDB實際執行ALTER TABLE ... ENGINE=InnoDB重建表)、ARCHIVE。
執行頻率建議:
mysql> REPAIR TABLE `orders` QUICK;
+--------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------+--------+----------+----------+
| db.orders | repair | status | OK |
+--------------+--------+----------+----------+
mysql> OPTIMIZE TABLE `logs`;
+-----------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+-----------+----------+----------+-------------------------------------------------------------------+
| db.logs | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| db.logs | optimize | status | OK |
+-----------+----------+----------+-------------------------------------------------------------------+
Msg_type = status 且 Msg_text = OK 表示操作成功;若為 error 或 warning 需進一步排查。
ANALYZE TABLE更新統計資訊,ALTER TABLE tbl ENGINE=InnoDB重建表空間。SHOW TABLE STATUS中Data_free欄位評估是否需OPTIMIZE。善用這兩個指令,配合定期備份與監控,能有效維持MySQL資料庫的健康狀態與查詢效能。