MySQL 性能瓶頸 80% 以上源於 SQL 語句本身。本文聚焦兩大核心診斷手段:慢查詢日誌配置分析與實時進程列監控,幫助快速定位並解決線上性能問題。
-- 查看慢查詢閾值(默認 10 秒,建議改為 1 秒)
SHOW VARIABLES LIKE 'long_query_time';
-- 查看慢查詢開關與文件路徑
SHOW VARIABLES LIKE 'slow_query_log%';
-- 查看是否記錄未使用索引的查詢
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';
SET GLOBAL long_query_time = 1; -- 1 秒閾值
SET GLOBAL slow_query_log = 'ON'; -- 開啟慢查詢日誌
-- 可選:記錄未走索引的查詢(高併發慎開,日誌量大)
-- SET GLOBAL log_queries_not_using_indexes = 'ON';
持久化配置:修改 my.cnf [mysqld] 區段:
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 1
# log_queries_not_using_indexes = 1
# 典型用法
pt-query-digest /var/lib/mysql/slow.log --limit 20 --order-by Query_time:cnt
| 列名 | 含義 | 關注重點 |
|---|---|---|
| Id | 連接標識 | KILL 對象 |
| User | 登錄用戶 | 區分應用/管理員 |
| Host | 客戶端 IP:Port | 定位來源應用 |
| db | 當前數據庫 | 業務域劃分 |
| Command | 命令類型 | Sleep/Query/Connect 等 |
| Time | 當前狀態持續秒數 | 長時間=潛在阻塞 |
| State | 線程狀態 | Sending data/Locked/Copying to tmp table |
| Info | 執行的 SQL 片段 | 直接可見問題語句 |
-- 顯示完整 SQL(不截斷)
SHOW FULL PROCESSLIST;
-- 只看非 Sleep 的活躍會話
SHOW FULL PROCESSLIST WHERE Command != 'Sleep';
-- 結合 Information Schema 做聚合統計
SELECT Command, COUNT(*), AVG(Time)
FROM information_schema.PROCESSLIST
GROUP BY Command;
SHOW FULL PROCESSLIST 定位阻塞鏈、長事務、大查詢。EXPLAIN 驗證索引命中、掃描行數、臨時表、文件排序。log_queries_not_using_indexes 在高併發下會產生海量日誌,建議定時開啟採樣而非常開。SHOW PROCESSLIST 本身有鎖開銷,極高併發下慎用,優先查 performance_schema.threads。Sleep 連接,檢查連接池配置(wait_timeout、max_idle)與應用釋放邏輯。建立「慢查詢日誌常態化分析 + 進程列實時巡檢」的雙軌機制,是 MySQL 性能治理的基石。