Mysql SQL性能分析及調優


1、查看profile

打開profile開關后,執行SQL語句后,再執行 show profile即可看到profile內容:

 

 

 這些數據會被Mysql記錄在 INFORMATION_SCHEMA.PROFILING 表中。

但有一個問題,一個查詢它最多記錄100條,而一個復雜的SQL語句,細節數據遠超100條,導致細節記錄得不完整

這個問題暫時沒找到解決辦法。

通過下面的語句可以以倒序的方式將INFORMATION_SCHEMA.PROFILING表中的最近執行過的SQL的profile內容展現出來:

SELECT
    *
FROM
    INFORMATION_SCHEMA.PROFILING
ORDER BY
    QUERY_ID DESC,
    SEQ DESC;

查詢結果如下:

 我們可以看到 這個查詢的seq已經到了12270了,但這個表中也只會記錄100條。

profile的說明可以查看文章:  Mysql分析-profile詳解

 

 2、匯總profile

Show profile 給出了查詢執行的每個步驟及花費的時間,當語句是很簡單的一次執行的時候,可以很清楚的看出語句每個順序花費的時間,

但是當語句是嵌套循環等操作的時候,看這個報告就會變得很痛苦,

因此整理了以下語句對相同類型的操作進行匯總,腳本如下:

--其中 123 位 Query_Id
SELECT STATE,SUM(DURATION) AS TOTAL_R,
ROUND(100*SUM(DURATION)/(SELECT SUM(DURATION)
FROM INFORMATION_SCHEMA.PROFILING
WHERE QUERY_ID=@QUERY_ID),2) AS PCT_R,
COUNT(*) AS CALLS,
SUM(DURATION)/COUNT(*) AS "R/CALL"
FROM INFORMATION_SCHEMA.PROFILING
WHERE QUERY_ID= 123
GROUP BY STATE
ORDER BY TOTAL_R DESC;

結果如下圖:

 

3、查看進一步優化后的SQL,但並非最終執行的SQL

通過 explain 查看執行計划后,再執行show warnings,可以進一步查看 進一步優化后的SQL,

但這個也並非最終Mysql執行的SQL。(曾今拿一個show warnings 中的SQL執行,1秒中即得到查詢結果,但原SQL執行卻要28秒。側面說明show warnings 中的SQL並非真正執行的SQL)

explain select * from account;

show WARNINGS

執行結果為:

圖一為explain的結果:

 

 圖二為show Warnings的結果:

 

 我們可以看到進一步優化的語句。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM