| 操作 | 目的 | 適用引擎 | 鎖表 | 常用工具 |
|---|---|---|---|---|
| OPTIMIZE | 整理碎片、回收空間、更新索引統計 | MyISAM, InnoDB, ARCHIVE | 是 (排他鎖) | OPTIMIZE TABLE, mysqlcheck -o, myisamchk -r |
| ANALYZE | 更新索引統計信息( cardinality ),優化器受益 | MyISAM, InnoDB, BDB | 讀鎖 | ANALYZE TABLE, mysqlcheck -a, myisamchk -a |
| CHECK | 檢查表錯誤、校驗和、索引一致性 | MyISAM, InnoDB, CSV, ARCHIVE | 讀鎖 | CHECK TABLE, mysqlcheck, myisamchk |
| REPAIR | 修復損壞的 MyISAM 表 | 僅 MyISAM | 寫鎖 | REPAIR TABLE, mysqlcheck -r, myisamchk -r |
DELETE/UPDATE 導致行碎片(特別是含 VARCHAR/BLOB/TEXT 列)。SHOW TABLE STATUS 中 Data_free 較大。-- SQL 方式(服務運行中)
OPTIMIZE TABLE tbl_name;
-- mysqlcheck 命令行(服務運行中)
mysqlcheck -o db_name tbl_name -u root -p
mysqlcheck -o db_name -u root -p # 整庫優化
-- myisamchk 離線方式(服務停止或表無活動)
myisamchk --quick --check-only-changed --sort-index --analyze tbl_name
myisamchk -r /path/to/tbl_name.MYI # 修復並優化
注意:優化過程鎖表,需在低峰期執行;需預留至少表大小 1.5 倍磁盤空間。
ANALYZE TABLE tbl_name;
mysqlcheck -a db_name tbl_name -u root -p
InnoDB 從 5.6+ 支持持久化統計信息,innodb_stats_persistent=ON 時需手動 ANALYZE 更新。
CHECK TABLE tbl_name [QUICK | FAST | MEDIUM | EXTENDED | CHANGED];
mysqlcheck db_name tbl_name -u root -p # 默認 MEDIUM
QUICK:僅掃描索引樹,不讀數據行。EXTENDED:逐行校驗,最慢但最徹底。REPAIR TABLE tbl_name [QUICK | EXTENDED | USE_FRM];
mysqlcheck -r db_name tbl_name -u root -p
QUICK:僅修復索引樹,數據文件未變時最快。EXTENDED:逐行重建索引,可恢復更多數據但可能產生垃圾行。USE_FRM:.MYI 丟失或頭部損壞時,用 .frm 定義重建索引。#!/bin/bash
# daily_maintenance.sh - 每天凌晨 3 點執行
DB_USER="root"
DB_PASS="your_password"
DB_NAME="your_db"
LOG="/var/log/mysql_maintenance.log"
echo "$(date) START" >> $LOG
mysqlcheck -o -a -c $DB_NAME -u$DB_USER -p$DB_PASS >> $LOG 2>&1
echo "$(date) END" >> $LOG
配合 crontab -e:0 3 * * * /path/to/daily_maintenance.sh