如何快速定位消耗 CPU 最高的 sql 語句,怎麼做?看看下面的介紹。
概述
如果是Oracle數據庫我們可以很容易通過sql來定位到當前數據庫中哪些消耗CPU高的語句,而mysql數據庫可以怎麼定位呢?這裏用一個簡單例子說明下...
主要是瞭解如何定位的思路,具體看官網介紹..
參考:
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
新列來實現,以下方法適用於在其他內核正常運行時,某個特定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的多個樣本中驗證消耗是恆定的。根據這些信息,我們可以登錄到數據庫,並使用以下查詢找出哪個MySQL線程是罪魁禍首。
定位問題sql
select * from performance_schema.threads where thread_os_id = xx ;
select * from information_schema.`PROCESSLIST` where id=threads.processlist_id
根據操作系統id可以到processlist表找到對應的會話,如下:
查看問題sql執行計劃
這裏對應看一下執行計劃基本就可以判斷當前數據庫CPU爲什麼消耗這麼高了...
至於優化的點只需要在dock建一個索引即可,這裏就不介紹了。
往期推薦
本文分享自微信公衆號 - 俠夢的開發筆記(xmdevnote)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。