實際應用中,分析單條查詢SQL性能,有3種方法:show status、show profile和慢查詢日誌。sql
1、使用SHOW PROFILE服務器
一、默認是禁用的,在會話中開啓session
#開啓profile set profiling=1;
二、當一個查詢到達服務器時,此工具會把分析信息記錄到一張臨時表,而且給查詢賦予一個從1開始的整數標識符,能夠經過show profiles查看。ide
三、上面只顯示了時間上的精度,可是有些時候咱們須要更多的信息那麼,咱們可使用工具
show profile for query 1;來看具體信息性能
報告給出了每一個步驟及其花費的時間,可是沒法快度定位哪一個步驟花費的時間最多,由於輸出沒法按花費時間來排序。日誌
固然咱們能夠經過INFORMATION_SCHEMA中對應的表來輸出咱們想要的信息。好比orm
#要查詢的SQL SET @query_id = 1; 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 = @query_id GROUP BY STATE ORDER BY Total_R DESC;
就能夠看到下面的格式blog
經過結果,能夠清楚看到消耗時間最多的是「發送數據(Sending data)」,這裏主要是由於我查詢了一個有500W記錄的表,而且id沒有使用索引。排序
2、使用SHOW STATUS
show status 命令返回了一些計數器。既有服務器級別的全局計數器,也有基於某個鏈接的會話級別的計數器。不一樣的計數器可見範圍不同,全局的計數器也會出如今show status的結果中,容易被誤認爲是會話級別的。
show session status/show status 會話級別
show global status 全局級別
show status 結果只是計數器,沒法給出消耗多少時間。
好比查看會話或者從服務器啓動以來的增刪改查的次數
show status like "com_insert"; show status like "com_delete"; show status like "com_update"; show status like "com_select";
下面清空一下,再來作一次原來的查詢
這個數字說明這個查詢,沒有使用到索引,影響了500W條數據。
3、期待Performance Schema早日實現和普及吧!