慢查詢不僅拖慢單條 SQL,更可能引發連鎖反應癱瘓整個數據庫。本文復盤一起由錯誤子查詢引發的生產級故障,提煉通用排查方法論。
SHOW PROCESSLIST:會話數暴增至 600+(正常 ~100),大量 Locked 狀態。查看慢查詢日志,發現問題 SQL 集中在幾條:包含 SUM、COUNT、等值操作,且均使用子查詢。`long_query_time=3s`,實際執行卻達幾十秒。
腳本批量 Kill 相關會話,但新連接湧入速度遠超 Kill 速度,`mysqld` 進程 CPU/內存持續居高不下。
發現頂部有幾條 SQL,Time 列高達 30000 秒(~10小時)!EXPLAIN 顯示 Using temporary、Using filesort,典型的低效執行計劃。
結論:錯誤的子查詢(大表關聯、臨時表、文件排序)是故障罪魁禍首。
EXPLAIN 分析執行計劃,識別 Using temporary、filesort、全表掃描等紅旗標誌。# 1. 導出全量進程
mysql -uroot -p'XXX' -e "SHOW FULL PROCESSLIST;" > /tmp/full_process.txt
# 2. 篩選目標會話 ID(如按 Info 關鍵字)
grep "bad_sql_keyword" /tmp/full_process.txt | awk '{print $1}' > /tmp/kill_ids.txt
# 3. 生成 Kill 語句並執行
mysql -uroot -p'XXX' -e "$(awk '{print "KILL " $1 ";"}' /tmp/kill_ids.txt)"
# 或純 SQL 生成(無需導出文件)
SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE info LIKE '%bad_sql_keyword%';
將上述邏輯封裝為可複用腳本,納入應急預案庫,關鍵時刻秒級止血。