如何閱讀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

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


分享到:


相關文章: