天天看點

MySQL slow query [慢查詢] 資料整理

前言:

mysql中提供了一個慢查詢的日志記錄功能,可以把查詢sql語句時間大于多少秒的語句寫入慢查詢日志,日常維護中可以通過慢查詢日志的記錄資訊快速準确地判斷問題所在。

 (有點類似 oracle的v$session_longops )

如下為mysql slow query[慢查詢]配置、log檔案參數介紹、腳本實作每天以日期格式生成新的log檔案等..

<b>1、/etc/my.cnf 配置 slow query  </b>

<b></b>

#開啟慢查詢

slow_query_log=on   

#超過2秒的查詢就視為慢查詢

long_query_time=2

#記錄日志

slow_query_log_file=/data/mysql/slow.log

<b>2、mysql資料庫中檢視參數具體值</b>

1)mysql&gt; show variables like '%long_query_time%';

     +-----------------+----------+

     | variable_name   | value    |

     | long_query_time | 2.000000 |  

     +-----------------+----------+  

2) mysql&gt;  show variables like '%slow_query_log%';

     +------------------------------+---------------------------+

     | variable_name                          | value                     |

     | slow_query_log                        | on                        |

     | slow_query_log_file                  | /data/public3306/slow.log |

     +------------------------------+---------------------------+ 

mysql&gt; 

<b>3、slow.log資訊解讀 及其mysqldumpslow分析簡單介紹</b>

1)

slow.log資訊解讀

# time: 070927  8:08:52

# user@host: root[root] @  [192.168.0.20]

# query_time: 372  lock_time: 136  rows_sent: 152  rows_examined: 263630

select id, name from manager where id in (66,10135);

query_time == 用的時間'秒'

lock_time   ==鎖的時間'秒'

rows_sent  ==傳回行數

rows_examined==共查詢行數

2)

slow log 檢視工具mysqldumpslow  

通過mysqldumpslow –help或--help 檢視sllow query log 

常用:

-s,是order的順序,說明寫的不夠詳細,俺用下來,包括看了代碼,主要有 

c,t,l,r和ac,at,al,ar,分别是按照query次數,時間,lock的時間和傳回的記錄數來排序,前面加了a的時倒叙 

-t,是top n的意思,即為傳回前面多少條的資料 

-g,後邊可以寫一個正則比對模式,大小寫不敏感的 

mysqldumpslow -s c -t 20 host-slow.log 

mysqldumpslow -s r -t 20 host-slow.log 

上述指令可以看出通路次數最多的20個sql語句和傳回記錄集最多的20個sql。 

mysqldumpslow -t 10 -s t -g “left join” host-slow.log 

這個是按照時間傳回前10條裡面含有左連接配接的sql語句。

###### 查詢慢查詢log中超過10s sql的個數(包括重複的sql)..

grep query_time: slow.log |awk '$3&gt;=10{printf("%.f\n",$3)}'|wc -l

<b>4、其他參數設定 </b>

慢查詢相關的 參數log_queries_not_using_indexes

如果log_queries_not_using_indexes為on的話,當執行一個sql語句的時候,如果一個表沒有索引就會把這個資訊記錄在慢查詢檔案中

show variables like "%log_queries_not%" ; 

set global log_queries_not_using_indexes=on;

<b>5、腳本實作slow query每天以日期形式新生成一個log</b>

*** 為了便捷統計每天slow query查詢 量和性能問題,特寫腳本實作slow query每天以日期形式新生成一個log 

*** 其實就是一個 /usr/bin/mysql -uroot  -n -e "set global slow_query_log_file='/data/mysql/slow_`date +%y_%m_%d`.log';" 

*** 隻是直接在crontab 寫指令一直不生效,考慮可能是因為"" 雙引号原因,是以放在a.sh 提供執行權限 ‘x’即可執行<b>.</b>

<b>具體如下</b> :  

[root@lottery ~]# crontab  -l

0 0 * * * /bin/sh  /root/a.sh

[root@lottery ~]# cat a.sh

 /usr/bin/mysql -uroot  -n -e "set global slow_query_log_file='/data/mysql/slow_`date +%y_%m_%d`.log';"

[root@lottery ~]# 

mysql&gt;  show variables like 'slow_query%log%';

+------------------------------+-------------------------------------+

| variable_name                          | value                                               |

+-------------------------------+-------------------------------------+

| slow_query_log                         | on                                                  |

| slow_query_log_file                   | /data/mysql/slow_2015_05_12.log   |

+-------------------------------+-------------------------------------+ 

mysql&gt; system date +%y_%m_%d

2015_05_12

  【源于本人筆記】 若有書寫錯誤,表達錯誤,請指正...