MySQL_慢查詢日誌

  • MySQL的慢查詢日誌是 MySQL提供的一種日誌記錄,它用來記錄在 MySQL中響應時間超過閥值的語句,具體指運行時間超過long_ query_time值的SQL,則會被記錄到慢查詢日誌中。
  • 具體指運行時間超過long_query_time值的SQL,則會被記錄到慢查詢日誌中。long_query_time的默認值爲10,意思是運行10秒以上的語句。
  • 由他來査看哪些SQL超出了我們的最大忍耐時間值,比如一條sql執行超過5秒鐘,我們就算慢SQL,希望能收集超過5秒的sql,結合explain進行全面分析。

默認情況下, MySQL數據庫沒有開啓慢查詢日誌,需要我們手動來設置這個參數。

當然,如果不是調優需要的話,一般不建議啓動該參數,因爲開啓慢查詢日誌會或多或少帶來一定的性能影響。慢查詢日誌支持將日誌記錄寫入文件。

查看是否開啓及如何開啓

  • 查看默認:SHOW VARIABLES LIKE '%slow_query_log%';

    mysql> show variables like '%slow_query_log%';
    +---------------------+-----------------------------------+
    | Variable_name       | Value                             |
    +---------------------+-----------------------------------+
    | slow_query_log      | OFF                               |
    | slow_query_log_file | /var/lib/mysql/localhost-slow.log |
    +---------------------+-----------------------------------+
    2 rows in set (0.00 sec)
    
  • 開啓:SET GLOBAL slow_query_log = 1;

    mysql> SET GLOBAL slow_query_log = 1;
    Query OK, 0 rows affected (0.12 sec)
    
    mysql> show variables like '%slow_query_log%';
    +---------------------+-----------------------------------+
    | Variable_name       | Value                             |
    +---------------------+-----------------------------------+
    | slow_query_log      | ON                                |
    | slow_query_log_file | /var/lib/mysql/localhost-slow.log |
    +---------------------+-----------------------------------+
    2 rows in set (0.00 sec)
    

當前這樣設置只是臨時的,MySql重啓後,參數便會被重置,如果要永久有效,需要修改my.cnf文件,在[mysqld]下面添加slow_query_log=1slow_query_log_file=/var/lib/mysql/localhost-slow.log,然後重啓MySql。

[mysqld]
slow_query_log=1
slow_query_log_file=/var/lib/mysql/localhost-slow.log
long_query_time=1
log_output=FILE

開啓慢查詢日誌後,怎麼樣的SQL纔會記錄到慢查詢日誌裏面呢?

命令:show variables like '%long_query_time%';

mysql> show variables like '%long_query_time%';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)

這個是由 long_query_time 控制,默認情況下 long_query_time 的值爲10秒

可以使用命令修改,也可以在my.cnf配置文件中修改。

假如 一個SQL運行的時間剛好等於 long_query_time 的情況,並不會被記錄下來。也就是說,在mysql源碼是判斷大於 long_query_time 時間的才記錄,而不是大於等於

設置闕值時間:

命令:set global long_query_time=1 (爲了測試,設置成1秒鐘以上的爲慢查詢)

mysql> set global long_query_time=1;
Query OK, 0 rows affected (0.00 sec)
查看闕值時間

命令:show global variables like 'long_query_time'

(注意這裏使用的是show global variables,如果使用show variables無法看到,因爲需要重新開啓一個會話才能看到。)

mysql> show global variables like 'long_query_time';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

mysql> show variables like 'long_query_time'; #在修改闕值時間的本窗口中查詢,依舊是10秒
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
設置好後,測試一下是否可行

sql語句:

mysql> SELECT COUNT(*) FROM `goods`;
+----------+
| COUNT(*) |
+----------+
|  1520000 |
+----------+
1 row in set (1.62 sec)

/var/lib/mysql/localhost-slow.log中的記錄

# Time: 200110 13:58:46
# User@Host: root[root] @ localhost []  Id:    19
# Query_time: 1.613741  Lock_time: 0.000082 Rows_sent: 1  Rows_examined: 1520000
SET timestamp=1578664726;
SELECT COUNT(*) FROM `goods`;

查看慢sql條數

mysql> show global status like '%slow_queries%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries  | 14    |
+---------------+-------+
1 row in set (0.00 sec)

日誌分析工具 mysqldumpslow

語法:mysqldumpslow [ OPTS... ] [ LOGS... ]

root@localhost:/var/lib/mysql# 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 訪問次數
l 鎖定時間
r 返回記錄
t 查詢時間
al 平均鎖定時間
ar 平均返回記錄數
at 平均查詢時間
-t 返回前面多少條的數據
-g 後面搭配一個正則匹配模式,大小寫不敏感

常用命令

得到返回記錄集最多的10條sql
mysqldumpslow -s r -t 10 /var/lib/mysql/localhost-slow.log

得到訪問次數最多的10個sql
mysqldumpslow -s c -t 10 /var/lib/mysql/localhost-slow.log

得到按照時間排序的前10條裏面含有左連接的查詢語句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/localhost-slow.log

另外建議在使用這些命令時結合 | 和 more 使用,否則有可能出現爆屏情況
mysqldumpslow -s r -t 10 /var/lib/mysql/localhost-slow.log | more
發佈了45 篇原創文章 · 獲贊 7 · 訪問量 8284
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章