如何快速定位當前資料庫消耗 CPU 最高的 sql 語句?

Laravel00發表於2021-12-22

文章來自:PHP開源社群


如何快速定位消耗 CPU 最高的 sql 語句,怎麼做?看看下面的介紹。

概述

如果是Oracle資料庫我們可以很容易透過sql來定位到當前資料庫中哪些消耗CPU高的語句,而mysql資料庫可以怎麼定位呢?這裡用一個簡單例子說明下…

主要是瞭解如何定位的思路,具體看官網介紹..

參考:www.percona.com/blog/2020/04/23/a-...

主要意思是針對定位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建一個索引即可,這裡就不介紹了。

圖片

本作品採用《CC 協議》,轉載必須註明作者和本文連結
溫馨提示:微信搜尋並關注   學Laravel  裡面有兩套Laravel課程:【laravel7.x 從入門到核心架構講解】 與 【Laravel高階實戰教程42集】,直接獲取就可以了,學習與交流可加入:Laravel技術交流微信群

相關文章