1. 程式人生 > >MySQL (一) —— MySQL效能優化之 慢查詢日誌

MySQL (一) —— MySQL效能優化之 慢查詢日誌

                                        慢查詢日誌(slow-query-log)

 

一、什麼是慢查詢日誌?

  慢查詢日誌是MySQL提供的一種日誌記錄,用來記錄在MySQL中響應

(執行)時間超過閥值long_query_time,預設值:10,單位:)的SQL語句。

  預設情況下,MySQL沒有啟用慢查詢日誌。進行MySQL調優時,則可以開啟慢查詢日誌,調優完成後,建議關閉慢查詢日誌,因為開啟慢查詢日誌會或多或少帶來一定的效能影響。

登陸資料庫:mysql –uroot –p
Enter password:

檢視 MySQL 慢查詢日誌

  1、檢視慢查詢日誌是否開啟:mysql> show variables like 'slow_query_log%';

  slow_query_log 慢查詢開啟狀態 OFF 未開啟;ON 為開啟;

mysql> show variables like 'slow_query_log%';
+---------------------+-------------------------------------+
| Variable_name       | Value                               |
+---------------------+-------------------------------------+
| slow_query_log      | OFF                                  |
| slow_query_log_file | /home/data/mysql/localhost-slow.log |
+---------------------+-------------------------------------+
2 rows in set (0.00 sec)

     2、檢視慢查詢日誌超時時間:mysql> show variables like 'long_query_time';

  long_query_time 查詢超過多少秒才記錄   預設10秒,修改為1秒。

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

 

二、如何開啟 MySQL 慢查詢日誌

兩種方法:

  1、臨時開啟慢查詢:不需要重啟資料庫,但當 MySql 重啟後慢查詢就失效

  mysql> set global slow_query_log=1;   ||   mysql> set global slow_query_log=on;

mysql> set global slow_query_log=on;
Query OK, 0 rows affected (0.00 sec)

   2、修改配置檔案 /etc/my.cnf ;找到 [mysqld] 下面新增:

slow_query_log =1
slow_query_log_file="/home/data/mysql/localhost-slow.log"
long_query_time = 1

  修改後重啟 MySQL:service mysqld restart ;

  再次,檢視慢查詢日誌開啟狀態:mysql> show variables like '%query%';

  slow_query_log:ON (已開啟)

  slow_query_log_file:/home/data/mysql/localhost-slow.log(表示指定慢查詢日誌的儲存路徑)。

mysql> show variables like '%query%';
+------------------------------+-------------------------------------+
| Variable_name                | Value                               |
+------------------------------+-------------------------------------+
| binlog_rows_query_log_events | OFF                                 |
| ft_query_expansion_limit     | 20                                  |
| have_query_cache             | YES                                 |
| long_query_time              | 1.000000                            |
| query_alloc_block_size       | 8192                                |
| query_cache_limit            | 1048576                             |
| query_cache_min_res_unit     | 4096                                |
| query_cache_size             | 1048576                             |
| query_cache_type             | OFF                                 |
| query_cache_wlock_invalidate | OFF                                 |
| query_prealloc_size          | 8192                                |
| slow_query_log               | ON                                  |
| slow_query_log_file          | /home/data/mysql/localhost-slow.log |
+------------------------------+-------------------------------------+
13 rows in set (0.00 sec)

 

三、慢查詢日誌分析工具  --  mysqldumpslow

  mysqldumpslowMySQL自帶的分析慢查詢的工具。

  測試:mysql> select sleep(2.0);

mysql> select sleep(2.0);
+----------+
| sleep(2.0) |
+----------+
|        0 |
+----------+
1 row in set (2.00 sec)

  檢視幫助命令:[[email protected] ~]# mysqldumpslow -h 

[[email protected] ~]# mysqldumpslow -h
Option h requires an argument
ERROR: bad option

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  表示 top n,即返回前面多少條資料;

  -g  表示正則匹配模式,不區分大小寫。

mysqldumpslow使用舉例:

1、獲取前 3 個SQL語句  -t 3

  [[email protected] ~]# mysqldumpslow -t 3 /home/data/mysql/localhost-slow.log

[[email protected] ~]# mysqldumpslow -t 3 /home/data/mysql/localhost-slow.log

Reading mysql slow query log from /home/data/mysql/localhost-slow.log
Count: 3  Time=2.29s (6s)  Lock=0.00s (0s)  Rows=1.0 (3), mmo_admin[mmo_admin]@[192.168.1.230]
  select sleep(N.N)

Died at /usr/bin/mysqldumpslow line 161, <> chunk 3.

  其中:

  Count: 3  Time=2.29s (6s)  Lock=0.00s (0s)  Rows=1.0 (3), mmo_admin[mmo_admin]@[192.168.1.230]
     select sleep(N.N)

  表示:

  Count  出現次數=3次 

  Time  執行最長時間=2.29秒(累計總耗費時間=6秒)

  Lock  等待鎖的時間=0秒

  Rows  傳送給客戶端的行總數=1行(掃描的行總數=3行)

  mmo_admin  使用者=mmo_admin @ 當前登入IP=192.168.1.230

  select sleep(N.N)  實際執行的SQL語句(抽象化型別SQL)

2、按照時間排序且含有'sleep'的 top 3 個SQL語句  -s t  -t 3 -g "sleep"

  [[email protected] ~]# mysqldumpslow -s t -t 3 -g "sleep" /home/data/mysql/localhost-slow.log | more

[[email protected] ~]# mysqldumpslow -s t -t 3 -g "sleep" /home/data/mysql/localhost-slow.log | more

Reading mysql slow query log from /home/data/mysql/localhost-slow.log
Died at /usr/bin/mysqldumpslow line 161, <> chunk 3.
Count: 3  Time=2.29s (6s)  Lock=0.00s (0s)  Rows=1.0 (3), mmo_admin[mmo_admin]@[192.168.1.230]
  select sleep(N.N)

  在命令後面加上:| more ,可以避免可能出現的刷屏的情況,便於檢視。

3、獲取訪問次數最多的 5 個SQL語句  -s c -t 5

  [[email protected] ~]# mysqldumpslow -s c -t 5 /home/data/mysql/localhost-slow.log | more

 

四、小結

  1、預設情況下,MySQL沒有啟用慢查詢日誌;

  2、開啟 MySQL 慢查詢日誌有兩種方法:mysql> set global slow_query_log=1 或者 修改配置檔案 /etc/my.cnf ;

  3、可以使用MySQL自帶的分析工具:mysqldumpslow ,進行慢查詢日誌分析;

  4、調優完成後,建議關閉慢查詢日誌