一、mysqldumpslow
官方文件:http://dev.mysql.com/doc/refman/5.1/en/mysqldumpslow.html
shell> mysqldumpslow [options
] [log_file
...]
Table 4.12. mysqldumpslow Option Reference
Format | Config File | Description | Introduction | Deprecated | Removed |
---|
-a | | Do not abstract all numbers to N and strings to S | | | |
-n num | | Abstract numbers with at least the specified digits | | | |
--debug | debug | Write debugging information | | | |
-g pattern | | Only consider statements that match the pattern | | | |
--help | | Display help message and exit | | | |
-h name | | Host name of the server in the log file name | | | |
-i name | | Name of the server instance | | | |
-l | | Do not subtract lock time from total time | | | |
-r | | Reverse the sort order | | | |
-s value | | How to sort output | | | |
-t num | | Display only first num queries | | | |
--verbose | verbose | Verbose mode | | | |
mysql有一個功能就是可以log下來執行的比較慢的sql語句,預設是沒有這個log的,為了開啟這個功能,要修改my.cnf或者在mysql啟動的時候加入一些引數。如果在my.cnf裡面修改,需增加如下幾行
long_query_time = 1
log-slow-queries = /var/youpath/slow.log
log-queries-not-using-indexes
long_query_time 是指執行超過多久的sql會被log下來,這裡是1秒。
log-slow-queries 設定把日誌寫在那裡,可以為空,系統會給一個預設的檔案host_name-slow.log,我生成的log就在mysql的data目錄
log-queries-not-using-indexes 就是字面意思,log下來沒有使用索引的query。
把上述引數開啟,執行一段時間,就可以關掉了,省得影響生產環境。
接下來就是分析了,我這裡的檔名字叫host-slow.log。
先mysqldumpslow –help以下,俺主要用的是
-s ORDER what to sort by (t, at, l, al, r, ar etc), ‘at’ is default
-t NUM just show the top n queries
-g PATTERN grep: only consider stmts that include this string
-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語句。
用了這個工具就可以查詢出來那些sql語句是效能的瓶頸,進行最佳化,比如加索引,該應用的實現方式等。
二、mysqldumpslow
MySQL 自帶 slow log 的分析工具 mysqldumpslow ,但是沒有說明。本文透過分析該指令碼,介紹了其用法。
slow log 是 MySQL 根據 SQL 語句的執行時間設定,寫入的一個檔案,用於分析執行較慢的語句。
只要在 my.cnf 檔案中配置好:
log-slow-queries = [slow_query_log_filename]
即可記錄超過預設的 10s 執行時間的 SQL 語句。
如果要修改預設設定,可以新增:
long_query_time = 5
設定為 5s 。
如果要記錄所有 SQL 語句,可以寫入:
log-long-format
# t=time, l=lock time, r=rows
# at, al, 以及 ar 是對應的平均值
mysqldumpslow 可以接受的引數有:
'v+', # verbose
'd+', # debug
's=s', # 排序 (t, at, l, al, r, ar etc)
'r!', # 倒排序 (largest last instead of first)
't=i', # 顯示最高的 n 個查詢
'a!', # 不把所有的數字以 N ,字串以 'S' 顯示
'n=i', # abstract numbers with at least n digits within names
'g=s', # grep: only consider stmts that include this string
'h=s', # hostname of db server for *-slow.log filename (can be wildcard)
'i=s', # name of server instance (if using mysql.server startup script)
'l!', # don't subtract lock time from total time
'verbose|v+',# verbose
'help+', # write usage info
'debug|d+', # debug
's=s', # what to sort by (t, at, l, al, r, ar etc)
'r!', # reverse the sort order (largest last instead of first)
't=i', # just show the top n queries
'a!', # don't abstract all numbers to N and strings to 'S'
'n=i', # abstract numbers with at least n digits within names
'g=s', # grep: only consider stmts that include this string
'h=s', # hostname of db server for *-slow.log filename (can be wildcard)
'i=s', # name of server instance (if using mysql.server startup script)
'l!', # don't subtract lock time from total time
以時間倒序顯示前10個慢查詢日誌:mysqldumpslow -s at -t 10 /var/db/mysql/db-slow.log
來源: