Mysql慢查詢開啟
Mysql的查詢訊日誌是Mysql提供的一種日誌記錄,它用來記錄在Mysql中響應時間超過閾值的語句,具體指執行時間超過long_query_time值得SQL,則會被記錄到慢查詢日誌中。long_query_time的預設為10,意識是執行10秒以上的語句。由它來看那些SQL語句超出了我們的最大忍耐值,比如一條SQL執行超過了5秒,我們就算慢查詢,我們就可以結合Explain進行分析。
預設Mysql沒有開啟慢查詢,需要我們說動設定這個引數。當然,如果不是調優需要的話,一般不建議開啟該引數,因為開啟慢查詢日誌會或多或少帶來一定的效能影響。慢查詢日誌支援將日誌寫入檔案。
進入mysql終端檢視是否開啟(我這裡都是自己改過的)
MySQL [test_db]> show variables like '%slow_query_log%';
+---------------------+----------------------------+
| Variable_name | Value |
+---------------------+----------------------------+
| slow_query_log | ON |
| slow_query_log_file | /data/mysql/mysql-slow.log |
+---------------------+----------------------------+
上面查詢結果第一行,這裡是開啟的,第二行是預設查詢路徑檔名。
MySQL [test_db]> set global slow_query_log = 0|1; //設定開啟或者關閉,0為關閉,1為開啟
如果使用set global slow_query_log 命令開啟慢查詢日誌,只對當前資料庫生效,如果Mysql重啟後則會失效。
補充:如果通過終端命令設定的話,再查詢是看不到修改結果的,需要新開啟一個視窗檢視即可。
如果要永久生效,必須修改配置檔案,修改完記得習慣性重啟服務。還是那句話,不建議生產環境開啟。
[mysqld]
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/mysql/mysql-slow.log
MySQL [test_db]> show variables like 'long_query_time';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+
假如SQL執行時間剛好等於long_query_time的情況,並不會被記錄下來,也就是說,在Mysql原始碼裡是判斷大於long_query_time,而非大於等於
開始測試(在開啟慢查詢的情況下)
MySQL [test_db]> select sleep(5);
檢視慢查詢日誌檔案
# cat /data/mysql/mysql-slow.log
#
# select sleep(5);
# Time: 2018-01-20T18:10:24.443517Z
# User@Host: root[root] @ localhost [] Id: 3
# Query_time: 5.000564 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
use test_db;
SET timestamp=1524276624;
select sleep(5);
以上資訊包括實際查詢時間5.000564秒,時間戳timestamp=1524276624,還有庫test_db,出問題的SQL。
mysqldumpslow用法講解
上面測試的慢查詢SQL只有一條,假如在實際的生產環境中,慢查詢SQL遠遠高於測試的數量,十幾條甚至幾十條,假如幾條慢查詢出現的頻率很高,我們能做到根據輕重優先順序來分析並排除那是不是更好?那麼就用到了mysqldumpslow
# 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 script)
-l don't subtract lock time from total time
s:是表示按照何種方式排序
c:訪問次數
i:鎖定時間
r:返回記錄
t:查詢時間
al:平均鎖定時間
ar:平均返回記錄數
at:平均查詢時間
t:即為返回前面多少條資料
g:後邊搭配一個正則匹配模式,大小寫不敏感
mysqldumpslow -s r -t 10 /data/mysql/mysql-slow.log //得到返回記錄集最多的10個SQL
mysqldumpslow -s c -t 10 /data/mysql/mysql-slow.log //得到訪問次數最多的10個SQL
mysqldumpslow -s t -t 10 -g "left join" /data/mysql/mysql-slow.log //得到按照時間排序的前10條裡面含有做了連線的查詢SQL
mysqldumpslow -s r -t 10 /data/mysql/mysql-slow.log | more //另外建議在使用這些命令時結合|和more使用,否則有可能出現爆屏情況
OK~既然學習了,就運用到實際工作中吧~