春節期間線上資料庫頻繁因壓力過大導致回應緩慢甚至癱瘓,團隊下定決心徹底解決效能瓶頸。由於長期秉持「快速開發、頻繁上線」原則,性能優化屢被忽視,技術債日積月累,系統愈發遲緩。本文將實戰過程完整複盤,從慢查詢日誌分析到具體優化策略,提供可落地的方法論。
慢查詢日誌預設位於 MySQL 資料目錄。確認 slow_query_log=ON 並設定 long_query_time 閾值(如 2 秒),即可記錄超時查詢。
建立分析表 slow_query,欄位涵蓋時間、用戶、主機、SQL 指紋、執行時間、鎖定時間、回傳行數、掃描行數、原始語句等。透過腳本將日誌解析入庫,便於後續 SQL 聚合分析。
在 slow_query 表上發揮想像力,重點捕捉:
SUM(query_time))COUNT(*))AVG(query_time))rows_examined)lock_time)-- 優化後 (2008-02-20 至 21)
AVG 5.72 秒 | 總計 2,197 筆 | 總耗時 12,574 秒
-- 優化前 (2008-02-17 至 18)
AVG 2.60 秒 | 總計 16,091 筆 | 總耗時 41,810 秒
雖平均耗時略增,但慢查詢筆數暴跌 86%,總資源消耗降低 70%,系統吞吐量大幅提升。
SELECT COUNT(*) n, SUM(query_time) s, AVG(query_time) avg,
SUBSTRING_INDEX(statement, ' ', 2) u
FROM slow_query
WHERE statement LIKE 'update%' AND query_time > 14
GROUP BY u;
結果顯示 update user 佔絕大多數(151 筆、平均 16 秒),揭露程式碼中存在「忘記釋放事務鎖」導致長時間阻塞。
SELECT SUM(query_time) sum, COUNT(*) cnt, AVG(query_time) avg, statement
FROM slow_query
WHERE host LIKE '%69.12.23.%'
GROUP BY content
ORDER BY sum DESC LIMIT 10;
前 3 筆屬同類查詢,佔總量 50%+,每分鐘 10+ 筆慢查詢,列為優先解決目標。
性能優化非一次性專案,而是持續迭代的工程文化。從「救火」到「防火」,關鍵在於建立可視化、可量化、可追蹤的慢查詢分析體系。願本文實戰經驗能為您的優化之路提供參考與啟發。