數據庫消耗 CPU 最高的 sql 語句如何定位?

如何快速定位消耗 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建一個索引即可,這裏就不介紹了。

圖片
(感謝閱讀,希望對你所有幫助)
來源:www.toutiao.com/i6923526305795293707

往期推薦



怎麼樣通過Nginx實現限流?

5個好用的開源網絡監控工具

SpringBoot實現登錄攔截的原理

keepalived實現Nginx雙機熱備

一行代碼讓你擺脫U盤完成局域網文件傳輸

Docker簡易搭建 ElasticSearch 集羣

我把跨境當副業,一個星期賺了7000塊”:想給有夢想的人提個醒!!!

這個基於jedis的Redis工具類可以收藏一下

ZooKeeper實現分佈式隊列、分佈式鎖和選舉,很詳細

Spring SchedulingConfigurer 實現動態定時任務

從原則、方案、策略及難點闡述分庫分表

(建議收藏)服務器宕機了不要慌,這樣排查效率高

本文分享自微信公衆號 - 俠夢的開發筆記(xmdevnote)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章