慢查询配置

MySQL的慢查询日志是MySQL提供的一种日志记录,它是用来记录在MySQL中响应时间超过阀值的语句。系统默认情况下,MySQL并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。

默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的,可以通过设置slow_query_log的值来开启,如下所示:

1
2
3
4
5
6
7
8
mysql> show variables like '%slow_query_log%'
+---------------------+-------------------------------+
| Variable_name | Value |
+---------------------+-------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/mysql-slow.log |
+---------------------+-------------------------------+
2 rows in set (0.00 sec)

开启慢查询日志:

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

然后看状态:

1
2
3
4
5
6
7
8
mysql> show variables like '%slow_query_log%';
+---------------------+-------------------------------+
| Variable_name | Value |
+---------------------+-------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/mysql-slow.log |
+---------------------+-------------------------------+
2 rows in set (0.00 sec)

使用set global slow_query_log=1开启了慢查询日志只对当前数据库生效,如果MySQL重启后则会失效。如果要永久生效,就必须修改配置文件my.cnf(其它系统变量也是如此)。

例如如下所示:

1
2
3
[root@mysql ~]# vim /etc/my.cnf
slow_query_log=1
slow_query_log_file=/var/lib/mysql/mysql-slow.log

参数说明:

  • slow_query_log 慢查询开启状态;
  • slow_query_log_file 慢查询日志存放的位置;
  • long_query_time查询超过多少秒才记录。

日志分析工具

MySQL 自带了一个查看慢日志的工具 mysqldumpslow,执行mysqldumpslow –help 可以查看其相关参数和说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@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:是top n的意思,即为返回前面多少条的数据;
  • -g:后边可以写一个正则匹配模式,大小写不敏感的。

例如,得到返回记录集最多的10个SQL:

1
mysqldumpslow -s r -t 10 /mysql/mysql_slow.log

得到访问次数最多的10个SQL:

1
mysqldumpslow -s c -t 10 /mysql/mysql_slow.log