高性能的MySQL(2)單條SQL性能

實際應用中,分析單條查詢SQL性能,有3種方法:show status、show profile和慢查詢日誌。sql

1、使用SHOW PROFILE服務器

一、默認是禁用的,在會話中開啓session

#開啓profile
set profiling=1;

二、當一個查詢到達服務器時,此工具會把分析信息記錄到一張臨時表,而且給查詢賦予一個從1開始的整數標識符,能夠經過show profiles查看。ide

141838957.png

三、上面只顯示了時間上的精度,可是有些時候咱們須要更多的信息那麼,咱們可使用工具

show profile for query 1;來看具體信息性能

142416986.png報告給出了每一個步驟及其花費的時間,可是沒法快度定位哪一個步驟花費的時間最多,由於輸出沒法按花費時間來排序。日誌

固然咱們能夠經過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

150847218.png

經過結果,能夠清楚看到消耗時間最多的是「發送數據(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";

下面清空一下,再來作一次原來的查詢

155313370.png

這個數字說明這個查詢,沒有使用到索引,影響了500W條數據。


3、期待Performance Schema早日實現和普及吧!

相關文章
相關標籤/搜索