首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 查詢緩慢根因總結:慢查詢、無索引、連線數過多、監控盲區

     編輯:MySQL 資料庫相關知識

線上 MySQL 經常出現查詢緩慢、甚至掛庫,核心原因通常集中在四大類。本文總結排查思路、監控盲區與工具鏈升級建議。

四大核心原因

  1. 慢查詢 / 無索引掃表:WHERE 條件欄位無索引、LIKE '%kw%'、隱式轉換、函數包裹欄位、大表深分頁。
  2. 無 LIMIT 保護:應用層未加 LIMIT,全表結果集傳輸佔滿網路/記憶體。
  3. 連線數耗盡 (Too many connections):連線池洩漏、長事務持有連線、wait_timeout 過大導致閒置連線堆積。
  4. 鎖爭用 / 熱點行:單行計數器高頻更新、大事務長鎖定、死鎖頻發。

傳統監控三大盲區

監控方式盲區改進
Zabbix/Prometheus 抓取狀態變數採樣間隔長 (30-60s)、非資料庫內核視角、無 SQL 級可見性輔以資料庫內部監控進程 (見下)
每週效能報表粒度粗、事後諸葛、無法即時告警改為分鐘級/秒級採集關鍵指標
Slow Log Top 10慢查詢爆發時 Top 10 失去代表性、定時任務 SQL 干擾引入過濾規則、結合 pt-query-digest 持續分析

輕量級節點監控進程 (自建/開源) 優勢

  • 實時採集:SHOW PROCESSLIST、SHOW ENGINE INNODB STATUS、GLOBAL STATUS 秒級抓取。
  • 智慧過濾:白名單排除已知定時任務/備份 SQL,聚焦異常。
  • 自動快照:連線數突增時自動保存 PROCESSLIST、INNODB STATUS、LOCKS 供事後分析。
  • Binlog 切點分析:配合 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

查詢緩存狀態變數參考 (歷史參考,8.0 已移除)

  • Qcache_hits / Qcache_inserts / Qcache_lowmem_prunes / Qcache_free_memory — 觀察命中率與記憶體壓力。

排查清單 (出現緩慢時優先檢查)

  1. SHOW PROCESSLIST 找出長時間運行 / Locked / Waiting 的查詢。
  2. EXPLAIN 分析可疑 SQL 執行計畫 (type=ALL、rows 偏大、Using temporary/filesort)。
  3. 檢查 Innodb_row_lock_waits、Innodb_row_lock_time_avg 鎖等待指標。
  4. 確認應用連線池配置 (最大連線、驗證查詢、取得超時)。
  5. 若為備份/分析任務衝突,調整排程錯峰執行。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved