| 操作 | 目的 | 適用引擎 | SQL 語法 | 命令行工具 | 離線工具 |
|---|---|---|---|---|---|
| OPTIMIZE | 碎片整理、回收空間、統計更新 | MyISAM, InnoDB, Archive | OPTIMIZE TABLE tbl | mysqlcheck -o db tbl | myisamchk -r tbl |
| ANALYZE | 更新索引統計信息(選擇率) | MyISAM, InnoDB, BDB | ANALYZE TABLE tbl | mysqlcheck -a db tbl | myisamchk -a tbl |
| CHECK | 檢查錯誤、更新索引統計 | MyISAM, InnoDB, CSV | CHECK TABLE tbl | mysqlcheck -c db tbl | myisamchk --check tbl |
| REPAIR | 修復損壞表 | 僅 MyISAM | REPAIR TABLE tbl | mysqlcheck -r db tbl | myisamchk -r tbl |
データサイズ 空間構建臨時表,**磁碟不足會失敗**ALTER TABLE ... ENGINE=InnoDB(重建聚簇索引)pt-online-schema-change 無鎖優化**index_cardinality,影響優化器選擇索引innodb_stats_persistent=ONQUICK(默認,僅檢查索引鏈)、FAST、CHANGED、MEDIUM、EXTENDED(最全、最慢)status: OK / Corrupted / WarningQUICK(修復索引樹)、EXTENDED(逐行重建索引,慢但徹底)#!/bin/bash
# 每日低峰執行:CHECK → 必要時 REPAIR → OPTIMIZE → ANALYZE
DB="prod_db"
TABLES=$(mysql -N -e "SHOW TABLES FROM $DB")
for TBL in $TABLES; do
# 1. 檢查
RESULT=$(mysql -N -e "CHECK TABLE $DB.$TBL" | awk '{print $4}')
if [[ "$RESULT" != "OK" ]]; then
echo "[$TBL] Check failed: $RESULT, attempting REPAIR..."
mysql -e "REPAIR TABLE $DB.$TBL"
fi
# 2. 優化(可選,按碎片率判斷)
# FRAG=$(mysql -N -e "SHOW TABLE STATUS $DB.$TBL" | awk '{print $10/$9}') # Data_free/Data_length
# if (( $(echo "$FRAG > 0.2" | bc -l) )); then
# mysql -e "OPTIMIZE TABLE $DB.$TBL"
# fi
# 3. 分析
mysql -e "ANALYZE TABLE $DB.$TBL"
done
mysqlcheck(服務運行中、支援所有引擎、可批量)myisamchk(服務停止、MyISAM 專用、修復能力最強)pt-online-schema-change --alter "ENGINE=InnoDB"**OPTIMIZE 整理碎片、ANALYZE 更新統計、CHECK 發現問題、REPAIR 修復 MyISAM**。建立**日檢查、周分析、月優化**的節奏,納入自動化運維體系,讓表健康度可視、可控、可追溯。