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的結果:
我們可以看到進一步優化的語句。