一:問題描述
今天早晨收到郵件告警,提示有臺數據庫服務器的cpu使用率在50%-70%間波動,有幾個瞬間達到了90多。
通過巡檢數據庫,發現有兩處異常:
① 故障期間的慢查詢日誌其中90%的慢查詢來自於同一個sql:
在半個小時內執行了2779次該sql。雖然sql單條執行不算很慢,只有2秒。但是執行次數太過頻繁。
查看執行計劃,發現走了全表掃描,該表數據量有200萬。
相當於平均每秒要掃描一次兩百萬條數據的表。
② 執行以下語句能看到有幾十條執行時間在1秒的查詢。平時這些查詢都執行得很快,執行該sql是看不到這些語句的。說明數據庫負載有些高了。
SELECT * FROM information_schema. `PROCESSLIST`
WHERE info IS NOT NULL
ORDER BY TIME DESC;
二:出錯原因
頻繁執行一個全表掃描的慢查詢導致cpu使用率上升。
三:解決辦法
創建索引優化
CREATE INDEX ind_user_create_tm ON us_user_eject(user_id,create_tm);
四:總結
不能對單條執行不算很慢的慢查詢掉以輕心,當執行次數很高了也容易引發故障。
之前也遇到過一次同樣的問題。上次是因爲使用了sysdate()沒有走索引,後來將sysdate()改成now()好了。