之前寫了一篇“MySQL慢查詢日誌總結“,總結了一些MySQL慢查詢日誌常用的相關知識,這裡總結一下在工作當中遇到關於MySQL慢查詢日誌的相關細節問題,有些是釋疑或自己有疑惑,自己測試驗證、解惑方面的知識。此篇只是總結個人的一些經驗,不足之處,敬請指正! 1: 為什麼在慢查詢日誌裡面出現Query... ...
之前寫了一篇“MySQL慢查詢日誌總結“,總結了一些MySQL慢查詢日誌常用的相關知識,這裡總結一下在工作當中遇到關於MySQL慢查詢日誌的相關細節問題,有些是釋疑或自己有疑惑,自己測試驗證、解惑方面的知識。此篇只是總結個人的一些經驗,不足之處,敬請指正!
1: 為什麼在慢查詢日誌裡面出現Query_time小於long_query_time閥值的SQL語句呢?
例如,如下截圖,long_query_time=5, 但是Query_time小於1秒的SQL都記錄到慢查詢日誌當中了。
相信有些人遇到這個問題的時候覺得很奇怪,其實這個不是bug,而是你設置了系統變數log_queries_not_using_indexes ,這個系統變數開啟後,
會將那些未使用索引的SQL也被記錄到慢查詢日誌中,另外,full index scan的SQL也會被記錄到慢查詢日誌。所以,當滿足這些條件的SQL,即
使Query_time時間小於long_query_time的值,也會被記錄到慢查詢日誌。
2: 使用日誌分析工具mysqldumpslow分析有些日誌非常慢,如何加快?
mysqldumpslow -s t -t 10 /var/lib/mysql/MyDB-slow.log
1: 出現這種情況是因為慢查詢日誌變得很大(個人遇到的案例,慢查詢日誌就有2G多了),所以,需要每天或每周切分慢查詢日誌。設置一個Crontab作業即可。
/var/lib/mysql/DB-Server-slow.log.20181112
/var/lib/mysql/DB-Server-slow.log.20181113
/var/lib/mysql/DB-Server-slow.log.20181114
/var/lib/mysql/DB-Server-slow.log.20181115
2: 開啟了系統變數log_queries_not_using_indexes後,如果系統設計糟糕,未使用索引的SQL很多,那麼這一類的日誌可能會有很多,所以還有個特別的開關log_throttle_queries_not_using_indexes用於限制每分鐘輸出未使用索引的日誌數量。
3:mysqldumpslow的生成報告中的Count、 Time、 Lock、Rows代表具體意思。
mysqldumpslow -s c -t 10 /var/lib/mysql/MyDB-slow.log 使用mysqldumpslow分析慢查詢日誌分析獲取訪問次數最多的10個SQL。
Count : 表示這個SQL總共執行了195674次(慢查詢日誌中出現的次數)
Time 表示執行時間,後面括弧裡面的38s 表示這個SQL語句累計的執行耗費時間為38秒。其實就是單次執行的時間和總共執行消耗的時間的區別。
Lock 表示鎖定時間,後面括弧裡面表示這些SQL累計的鎖定時間為48s
Rows 表示返回的記錄數,括弧裡面表示所有SQL語句累計返回記錄數
然後我們看看慢查詢日誌的相關信息:
# Time: 2018-11-15T01:43:51.338167Z
這個表示日誌記錄的時間,確切的說是SQL執行完的時間點。註意這個時間有可能跟系統當前時間不一致,它可能是UTC時間。這個要看系統變數log_timestamps是UTC還是system。
mysql> show variables like 'log_timestamps';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| log_timestamps | UTC |
+----------------+-------+
1 row in set (0.01 sec)
mysql> set global log_timestamps=system;
Query OK, 0 rows affected (0.00 sec)
# User@Host: xxx[xxx] @ [xxx.xxx.xxx.xxx] Id: 23781
客戶端的賬戶信息,兩個用戶名(第一個是授權賬戶,第二個為登錄賬戶),客戶端IP地址,還有mysqld的線程ID。
# Query_time: 16.480118 Lock_time: 0.000239 Rows_sent: 1 Rows_examined: 348011
查詢執行的信息,包括查詢時長,鎖持有時長,返回客戶端的行數,優化器掃描行數。通常需要優化的就是最後一個內容,儘量減少SQL語句掃描的數據行數
#use xxx;
#SET timestamp=1542246231;
這個是時間戳,你可以將其轉換為時間格式(註意時區),如下所示:
[root@mylnx02 ~]# date -d @1542246231
Thu Nov 15 09:43:51 CST 2018
[root@DB-Server ~]# date -d @1542246231
Wed Nov 14 20:43:51 EST 2018
4: 如何分析慢查詢日誌一段時間內的數據呢?
mysqldumpslow這款工具沒有提供相關參數分析某個日期範圍內的慢查詢日誌,也就是說沒法提供精細的搜索、分析。如果要分析某段時間內的慢查詢日誌可以使用工具pt-query-digest
如果實在需要使用mysqldumpslow分析某段時間內的慢查詢SQL,可以藉助awk命令的幫助。如下樣例所示
#取出一天時間的慢查詢日誌
# awk '/# Time: 2018-11-14/,/# Time: 2018-11-15/' DB-Server-slow.log > DB-Server-slow.log.20181114
#取出2018-11-14號4點到6點之間兩個小時的數據
#awk '/# Time: 2018-11-14T04/,/# Time: 2018-11-14T06/' DB-Server-slow.log > slow_04_06.log
5: 關於慢查詢日誌中query_time和lock_time的關係。
只有當一個SQL的執行時間(不包括鎖等待的時間 lock_time)>long_query_time的時候,才會判定為慢查詢SQL;但是判定為慢查詢SQL之後,輸出的Query_time包括了(執行時間+鎖等待時間),並且也會輸出Lock_time時間。當一個SQL的執行時間(排除lock_time)小於long_query_time的時候(即使他鎖等待超過了很久),也不會記錄到慢查詢日誌當中的。
6: mysqldumpslow相關參數的詳細信息