MySQL (一) —— MySQL效能優化之 慢查詢日誌
慢查詢日誌(slow-query-log)
一、什麼是慢查詢日誌?
慢查詢日誌是MySQL提供的一種日誌記錄,用來記錄在MySQL中響應
預設情況下,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
mysqldumpslow是MySQL自帶的分析慢查詢的工具。
測試: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、調優完成後,建議關閉慢查詢日誌。