快速定位當前數(shù)據庫消耗 CPU 最高的 sql 語句
點擊上方藍色“小哈學Java”,選擇“設為星標” 回復“資源”獲取獨家整理的學習資料!
如何快速定位消耗 CPU 最高的 sql 語句,怎么做?看看下面的介紹。
概述
如果是Oracle數(shù)據庫我們可以很容易通過sql來定位到當前數(shù)據庫中哪些消耗CPU高的語句,而mysql數(shù)據庫可以怎么定位呢?這里用一個簡單例子說明下...
主要是了解如何定位的思路,具體看官網介紹..
參考:
https://www.percona.com/blog/2020/04/23/a-simple-approach-to-troubleshooting-high-cpu-in-mysql/
主要意思是針對定位CPU的問題,Percona增加了對通過信息的TID列將processlist ID映射到OS線程ID的支持,而MySQL在5.7版本后在PERFORMANCE_SCHEMA.THREADS表加了一個THREAD_OS_ID新列來實現(xiàn),以下方法適用于在其他內核正常運行時,某個特定CPU的查詢過載的情況。
find out which session is using the most CPU resources in my database?
定位線程
pidstat -t -p <mysqld_pid> 1 5

通過該命令我們可以定位到**「802、4445等線程消耗了大量的CPU」**,這里盡量確保在pidstat的多個樣本中驗證消耗是恒定的。根據這些信息,我們可以登錄到數(shù)據庫,并使用以下查詢找出哪個MySQL線程是罪魁禍首。
定位問題sql
select * from performance_schema.threads where thread_os_id = xx ;
select * from information_schema.`PROCESSLIST` where id=threads.processlist_id

根據操作系統(tǒng)id可以到processlist表找到對應的會話,如下:

查看問題sql執(zhí)行計劃
這里對應看一下執(zhí)行計劃基本就可以判斷當前數(shù)據庫CPU為什么消耗這么高了...
至于優(yōu)化的點只需要在dock建一個索引即可,這里就不介紹了。

最近面試BAT,整理一份面試資料《Java面試BATJ通關手冊》,覆蓋了Java核心技術、JVM、Java并發(fā)、SSM、微服務、數(shù)據庫、數(shù)據結構等等。
獲取方式:點“在看”,關注公眾號并回復 Java 領取,更多內容陸續(xù)奉上。
文章有幫助的話,在看,轉發(fā)吧。
謝謝支持喲 (*^__^*)


