線上 MySQL 經常出現查詢緩慢、甚至掛庫,核心原因通常集中在四大類。本文總結排查思路、監控盲區與工具鏈升級建議。
WHERE 條件欄位無索引、LIKE '%kw%'、隱式轉換、函數包裹欄位、大表深分頁。LIMIT,全表結果集傳輸佔滿網路/記憶體。wait_timeout 過大導致閒置連線堆積。| 監控方式 | 盲區 | 改進 |
|---|---|---|
| Zabbix/Prometheus 抓取狀態變數 | 採樣間隔長 (30-60s)、非資料庫內核視角、無 SQL 級可見性 | 輔以資料庫內部監控進程 (見下) |
| 每週效能報表 | 粒度粗、事後諸葛、無法即時告警 | 改為分鐘級/秒級採集關鍵指標 |
| Slow Log Top 10 | 慢查詢爆發時 Top 10 失去代表性、定時任務 SQL 干擾 | 引入過濾規則、結合 pt-query-digest 持續分析 |
SHOW PROCESSLIST、SHOW ENGINE INNODB STATUS、GLOBAL STATUS 秒級抓取。PROCESSLIST、INNODB STATUS、LOCKS 供事後分析。mysqlbinlog 定位異常時間窗口。[mysqld] # 連線控制 max_connections = 2000 wait_timeout = 60 interactive_timeout = 60 thread_cache_size = 200 # 查詢緩存 (5.7 已棄用,8.0 移除,改用 Redis) # query_cache_type = 0 # query_cache_size = 0 # 表開啟緩存 table_open_cache = 4000 table_definition_cache = 2000 # 慢查詢 slow_query_log = 1 long_query_time = 1 log_queries_not_using_indexes = 1 log_throttle_queries_not_using_indexes = 100
Qcache_hits / Qcache_inserts / Qcache_lowmem_prunes / Qcache_free_memory — 觀察命中率與記憶體壓力。SHOW PROCESSLIST 找出長時間運行 / Locked / Waiting 的查詢。EXPLAIN 分析可疑 SQL 執行計畫 (type=ALL、rows 偏大、Using temporary/filesort)。Innodb_row_lock_waits、Innodb_row_lock_time_avg 鎖等待指標。