天天看點

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

實際應用中,分析單條查詢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,如需轉載請自行聯系原作者