如何閱讀MySQL慢查詢日誌

簡介

MySQL的慢查詢日誌是MySQL提供的一種日誌記錄,在數據庫變得非常大時,通常需要調試性能問題。通常由於缺少索引,當數據庫表只有一萬行時,查詢非常快,當表有數百萬行時,這些查詢將變得非常慢。MySQL慢查詢日誌是MySQL數據庫服務器註冊超過給定執行時間閾值的所有查詢的地方。

默認情況下,Mysql數據庫並不啟動慢查詢日誌,需要我們手動來設置這個參數,當然,如果不是調優需要的話,一般不建議啟動該參數,因為開啟慢查詢日誌會或多或少帶來一定的性能影響。慢查詢日誌支持將日誌記錄寫入文件,也支持將日誌記錄寫入數據庫表。

閱讀MySQL慢查詢日誌

慢查詢日誌位於:

/var/log/mysql/mysql-slow.log

出於安全原因,您只能使用sudo以root身份訪問此文件。

以應用程序的系統用戶身份登錄時,您將無法讀取此文件。

# Time: 140905 6:33:11 # User@Host: dbuser[dbname] @ hostname [1.2.3.4] # Query_time: 0.116250 Lock_time: 0.000035 Rows_sent: 0 Rows_examined: 20878 use dbname; SET timestamp=1409898791; ...SLOW QUERY HERE...

第一行,SQL查詢執行的時間

第二行,執行SQL查詢的連接信息

第三行記錄了一些我們比較有用的信息

Query_time SQL執行的時間,越長則越慢

Lock_time 在MySQL服務器階段(不是在存儲引擎階段)等待表鎖時間

Rows_sent 查詢返回的行數

Rows_examined 查詢檢查的行數

Slow Query日誌,雖然幫助你記錄了那些執行過了的SQL語句。但它不是萬能的,意義可能沒有你想象的那麼大。它只告訴了你哪些語句慢,但是為什麼慢?具體 原因,還是需要你自己去分析,不斷的調試。也許,你只需要換一條更有效的sql語句,也許你只需簡單地增加一個索引,但也有可能你需要調整你應用程序的設 計方案。比如,上面那條語句是很明顯,它檢查了600多萬行數據。不幸的是,並不是每條語句都這麼明顯。也許還有別的原因,比如:

*鎖表了,導致查詢處於等態狀態。lock_time顯示了查詢等待鎖被翻譯的時間

*數據或索引沒有被緩存。常見於第一次啟動服務器或者服務器沒有調優

*備份數據庫,I/O變慢

*也許同時運行了其它的查詢,減少了當前查詢

所以,不要過於緊張日誌文件某條記錄,而應該理性地審記,找出真正的原因。如果經常出現的slow query需要特別注意。如果個別出現,則做一些常規檢查即可。我們建議,統計並且形成基準報告,進行比較排除,比胡亂瞎撞有用。希望大家不要在這部分過於浪費時間與精力。

Using mysqldumpslow

而不是直接讀取慢速查詢日誌,通常最好使用命令mysqldumpslow來解析和彙總慢速查詢日誌。

您可以在以root用戶身份登錄時以這樣的方式運行命令

sudo -i mysqldumpslow /var/log/mysql/mysql-slow.log

日誌分析工具mysqldumpslow

在生產環境中,如果要手工分析日誌,查找、分析SQL,顯然是個體力活,MySQL提供了日誌分析工具mysqldumpslow

查看mysqldumpslow的幫助信息:

[root@DB-Server ~]# mysqldumpslow --help Usage: mysqldumpslow [ OPTS... ] [ LOGS... ] Parse and summarize the MySQL slow query log. Options are --verbose verbose --debug debug --help write this text to standard output -v verbose -d debug -s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default al: average lock time ar: average rows sent at: average query time c: count l: lock time r: rows sent t: query time -r reverse the sort order (largest last instead of first) -t NUM just show the top n queries -a don't abstract all numbers to N and strings to 'S' -n NUM abstract numbers with at least n digits within names -g PATTERN grep: only consider stmts that include this string -h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard), default is '*', i.e. match all -i NAME name of server instance (if using mysql.server startup>

-s, 是表示按照何種方式排序,

c: 訪問計數

l: 鎖定時間

r: 返回記錄

t: 查詢時間

al:平均鎖定時間

ar:平均返回記錄數

at:平均查詢時間

-t, 是top n的意思,即為返回前面多少條的數據;

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

比如

得到返回記錄集最多的10個SQL。

mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log

得到訪問次數最多的10個SQL

mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log

得到按照時間排序的前10條裡面含有左連接的查詢語句。

mysqldumpslow -s t -t 10 -g “left join” /database/mysql/mysql06_slow.log

另外建議在使用這些命令時結合 | 和more 使用 ,否則有可能出現刷屏的情況。

mysqldumpslow -s r -t 20 /mysqldata/mysql/mysql06-slow.log | more

參看文檔

http://www.cnblogs.com/kerrycode/p/5593204.html

文版權歸是 所有,轉載請標明出處。歡迎轉載,歡迎評論,歡迎分享。如果你有文章想分享可以聯繫我。