實際應用中,分析單條查詢SQL性能,有3種方法:show status、show profile和慢查詢日志。
一、使用SHOW PROFILE
1、預設是禁用的,在會話中開啟
1
2
<code>#開啟profile</code>
<code>set</code> <code>profiling=1;</code>
2、當一個查詢到達伺服器時,此工具會把分析資訊記錄到一張臨時表,并且給查詢賦予一個從1開始的整數辨別符,可以通過show profiles檢視。
<a href="http://blog.51cto.com/attachment/201310/141838957.png" target="_blank"></a>
3、上面隻顯示了時間上的精度,但是有些時候我們需要更多的資訊那麼,我們可以使用
show profile for query 1;來看具體資訊
當然我們可以通過INFORMATION_SCHEMA中對應的表來輸出我們想要的資訊。比如
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<code>#要查詢的SQL</code>
<code>SET</code> <code>@query_id = 1;</code>
<code>SELECT</code>
<code> </code><code>#執行步驟</code>
<code> </code><code>STATE,</code>
<code> </code><code>#每個步驟總時間</code>
<code> </code><code>SUM</code><code>(DURATION) </code><code>AS</code> <code>Total_R,</code>
<code> </code><code>#每個步驟占用總時間比例</code>
<code> </code><code>ROUND(</code>
<code> </code><code>100 * </code><code>SUM</code><code>(DURATION) /</code>
<code> </code><code>(</code><code>SELECT</code> <code>SUM</code><code>(DURATION) </code><code>FROM</code> <code>INFORMATION_SCHEMA.PROFILING</code>
<code> </code><code>WHERE</code> <code>QUERY_ID = @query_id),2</code>
<code> </code><code>) </code><code>AS</code> <code>Pct_R,</code>
<code> </code><code>#相同步驟執行次數</code>
<code> </code><code>COUNT</code><code>(*) </code><code>AS</code> <code>Calls,</code>
<code> </code><code>#相同步驟平均執行時間</code>
<code> </code><code>SUM</code><code>(DURATION) / </code><code>COUNT</code><code>(*) </code><code>AS</code> <code>"R/Call"</code>
<code>FROM</code> <code>INFORMATION_SCHEMA.PROFILING</code>
<code>WHERE</code> <code>QUERY_ID = @query_id</code>
<code>GROUP</code> <code>BY</code> <code>STATE</code>
<code>ORDER</code> <code>BY</code> <code>Total_R </code><code>DESC</code><code>;</code>
就可以看到下面的格式
<a href="http://blog.51cto.com/attachment/201310/150847218.png" target="_blank"></a>
通過結果,可以清楚看到消耗時間最多的是“發送資料(Sending data)”,這裡主要是因為我查詢了一個有500W記錄的表,并且id沒有使用索引。
二、使用SHOW STATUS
show status 指令傳回了一些計數器。既有伺服器級别的全局計數器,也有基于某個連接配接的會話級别的計數器。不同的計數器可見範圍不一樣,全局的計數器也會出現在show status的結果中,容易被誤認為是會話級别的。
show session status/show status 會話級别
show global status 全局級别
show status 結果隻是計數器,無法給出消耗多少時間。
比如檢視會話或者從伺服器啟動以來的增删改查的次數
<code>show status </code><code>like</code> <code>"com_insert"</code><code>;</code>
<code>show status </code><code>like</code> <code>"com_delete"</code><code>;</code>
<code>show status </code><code>like</code> <code>"com_update"</code><code>;</code>
<code>show status </code><code>like</code> <code>"com_select"</code><code>;</code>
下面清空一下,再來做一次原來的查詢
<a href="http://blog.51cto.com/attachment/201310/155313370.png" target="_blank"></a>
這個數字說明這個查詢,沒有使用到索引,影響了500W條資料。
三、期待Performance Schema早日實作和普及吧!
本文轉自shayang8851CTO部落格,原文連結:http://blog.51cto.com/janephp/1307369,如需轉載請自行聯系原作者