MySQL 效能調優 101 條建議:硬體、配置、架構、查詢與備份完整清單
本文整理自實戰經驗與社區最佳實踐,涵蓋 101 條調優建議,分為五大類。部分建議針對特定環境,但核心思路通用。建議配合上一篇《MySQL 效能優化 100 條實戰建議》對照閱讀,形成完整知識體系。
一、伺服器硬體與作業系統調校
- 足夠實體記憶體裝下整個 InnoDB 資料集
- 不惜一切代價避免 Swap
- 使用電池備援記憶體(BBWC)
- 採用 RAID 10+,避免 RAID 5 校驗開銷
- OS 與資料分區物理隔離
- 臨時空間、Relay Log、資料三分離
- 磁碟空間越大越快
- 選用更快磁碟
- SAS/SSD 替代 SATA
- 小容量磁碟組 RAID 優於大容量單盤
- 啟用 BBWC RAID 控制器
- 拒絕軟體 RAID
- 考慮 PCIe NVMe/固態 IO 卡(2GB/s+ 寫入)
- Linux
vm.swappiness=0
- 掛載加
noatime,nodiratime
- 優先 XFS,避免 ext3 雙重緩衝問題
- 調整 XFS 日誌與緩衝參數
- I/O 排程器用 NOOP/DEADLINE
- 強制 64 位元 OS
- 精簡系統服務與套件
- /etc/hosts 預解析主機名
- 嚴禁
kill -9 mysqld
- 專機專用,減少背景進程爭搶
二、MySQL 核心參數配置
- 寫入時用
innodb_flush_method=O_DIRECT 避免雙重緩衝
- 避免 O_DIRECT 搭配 EXT3
innodb_buffer_pool_size 覆蓋熱資料集
innodb_log_file_size 不宜過大,加速崩潰恢復
- 勿混用
innodb_thread_concurrency 與 thread_concurrency
max_connections 設定保守值
thread_cache_size ≥ 16
skip-name-resolve 跳過 DNS
- 查詢快取視場景啟用(高寫入慎用)
- 增大
tmp_table_size 防臨時表落盤
- 增大
max_heap_table_size 防臨時表落盤
sort_buffer_size 不宜過大
- 依
Key_read_requests/Key_reads 調 key_buffer_size
innodb_flush_log_at_trx_commit=0/2 提升寫入但犧牲持久性
- 建立獨立測試環境驗證配置
三、Schema 設計與索引優化
- 保持資料模型整潔
- 歸檔冷資料
- 高頻查詢欄位加索引
- 避免過度索引
- 壓縮 TEXT/BLOB
- UTF8/UTF16 效能低於 latin1
- 謹慎使用 Trigger
- 去除冗余欄位
- 多對多用關聯表
- 選用最小足夠資料型別
- 大欄位低頻存取時垂直拆分
- 定期
ANALYZE/OPTIMIZE TABLE
- InnoDB 表定期重建聚簇索引
- 大批量加欄位:Drop 索引 → 加欄位 → 建索引
- 業務選擇儲存引擎
- Archive 引擎存日誌/審計表
- Session 資料放 Redis/Memcached
- 可變長字串優先 VARCHAR
- Schema 變更小步快跑
- 測試環境模擬生產數據量驗證
- 勿隨意改動配置檔
- 配置檔「少即是多」
- 無把握時用官方通用配置模板

四、查詢優化實戰技巧
- Slow Query Log 捕捉慢查詢
EXPLAIN 分析執行計畫
- 定期回歸測試核心 SQL
- 避免
COUNT(*) 全表掃描
- SQL 寫法一致性利用 Query Cache
GROUP BY 替代 DISTINCT
WHERE/GROUP BY/ORDER BY 欄位加索引
- 索引保持簡潔
- 優化器選錯索引用
USE INDEX
- 啟用
SQL_MODE=STRICT
- 低基數欄位 UNION 用 LIMIT
- Upsert 用
INSERT ... ON DUPLICATE KEY UPDATE
- 求最大值用
ORDER BY desc LIMIT 1
- 禁用
ORDER BY RAND()
LIMIT M,N 深分頁慎用
- 子查詢改 JOIN/UNION
- 更新用
LOCK IN SHARE MODE 減少排他鎖
- 重啟後預熱 Buffer Pool
- 清空大表用
TRUNCATE 或 DROP+CREATE
- 嚴禁
SELECT *
- 使用長連接/連線池
- 壓測含背景負載
- 高負載時
SHOW PROCESSLIST 定位問題
- 可疑 SQL 在鏡像資料驗證
五、備份與災難恢復策略
- 從從庫備份
- 備份期間停止 SQL 執行緒
- 冷備份:停庫複製資料檔
- mysqldump 同步備份 Binlog
- 不信任 LVM 快照
- 單表導出加速單表恢復
- mysqldump 加
--opt
- 備份前
CHECK/OPTIMIZE TABLE
- 匯入前關閉 FK 與唯一性檢查
- 記錄庫/表/索引大小趨勢
- 自動化監控主從延遲與錯誤
- 定期排程備份
- 定期演練恢復