MySQLslowquery[慢查詢]資料整理

shy丶gril發表於2016-05-24

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

作者:lōττéry©版權所有[文章允許轉載,但必須以連結方式註明源地址,否則追究法律責任.]

前言:
MySQL中提供了一個慢查詢的日誌記錄功能,可以把查詢SQL語句時間大於多少秒的語句寫入慢查詢日誌,日常維護中可以通過慢查詢日誌的記錄資訊快速準確地判斷問題所在。
 (有點類似 oracle的v$session_longops )
如下為MySQL slow query[慢查詢]配置、log檔案引數介紹、指令碼實現每天以日期格式生成新的log檔案等..
1、/etc/my.cnf 配置 slow query  


#開啟慢查詢
slow_query_log=on   
#超過2秒的查詢就視為慢查詢
long_query_time=2
#記錄日誌
slow_query_log_file=/data/mysql/slow.log

2、mysql資料庫中檢視引數具體值


1)mysql> show variables like `%long_query_time%`;
     +—————–+———-+
     | Variable_name   | Value    |
     +—————–+———-+
     | long_query_time | 2.000000 |  
     +—————–+———-+  

2) mysql>  show variables like `%slow_query_log%`;
     +——————————+—————————+
     | Variable_name                          | Value                     |
     +——————————+—————————+
     | slow_query_log                        | ON                        |
     | slow_query_log_file                  | /data/public3306/slow.log |
     +——————————+—————————+ 
mysql> 


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


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 
上述命令可以看出訪問次數最多的20sql語句和返回記錄集最多的20sql 
mysqldumpslow -t 10 -s t -g “left join” host-slow.log 
這個是按照時間返回前10條裡面含有左連線的sql語句。

###### 查詢慢查詢log中超過10s sql的個數(包括重複的sql)..
grep Query_time: slow.log |awk `$3>=10{printf(“%.f
“,$3)}`|wc -l


4、其他引數設定 


慢查詢相關的 引數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;



5、指令碼實現slow query每天以日期形式新生成一個log


*** 為了便捷統計每天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’即可執行.
具體如下 :  
[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>  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> system date +%Y_%m_%d
2015_05_12
mysql> 
 


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


相關文章