SQL 語句優化是資料庫效能調校的核心環節。本文系統梳理 MySQL 優化的標準流程,涵蓋狀態監控、慢查詢定位、執行計劃分析及具體優化策略,助你快速定位效能瓶頸。
SHOW [SESSION|GLOBAL] STATUS 觀察 Com_select、Com_insert、Com_update、Com_delete 等計數器,快速判斷業務是「讀多寫少」還是「寫多讀少」。slow_query_log),設定閾值(預設 10 秒),自動記錄超時語句。EXPLAIN,重點關注 type(連接類型)、key(實際用到的索引)、rows(預估掃描行數)、Extra(Using index / Using where / Using filesort 等提示)。| 變數 | 含義 | 適用場景 |
|---|---|---|
Com_select | SELECT 執行次數 | 評估讀負載佔比 |
Com_insert | INSERT 執行次數(批次算 1 次) | 評估寫入頻率 |
Com_update | UPDATE 執行次數 | 評估更新熱度 |
Com_delete | DELETE 執行次數 | 評估刪除頻率 |
Innodb_rows_read | InnoDB 讀取行數 | 精確量化全表掃描代價 |
Innodb_rows_inserted | InnoDB 插入行數 | 監控批量導入效率 |
slow_queries | 慢查詢累計次數 | 判斷是否需調整 long_query_time |
connections | 嘗試連線總數(含失敗) | 排查連線風暴 |
uptime | 服務運行秒數 | 計算 QPS/TPS 基準 |
# 1. 永久生效請寫入 my.cnf [mysqld] 區段
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1 # 建議生產環境設 1 秒
log_queries_not_using_indexes = 1 # 記錄無索引查詢
# 2. 即時生效(重啟失效)
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1;
WHERE、JOIN、ORDER BY、GROUP BY 欄位;遵循「最左前綴」原則。WHERE id > last_id LIMIT n 或覆蓋索引子查詢。INSERT ... VALUES (),(),() 或 LOAD DATA INFILE 替代單條插入。READ COMMITTED 降低鎖競爭。# 觀察 Handler 計數器
SHOW GLOBAL STATUS LIKE 'Handler_read%';
# Handler_read_key 越高越好(索引命中)
# Handler_read_rnd_next 越低越好(全表掃描)
持續監控、定期複盤,才能讓 MySQL 始終保持高效穩定。