mysql的慢查询

慢查询是什么

Mysql的慢查询日志是Mysql提供的一种日志记录,它用来记录在Mysql中响应时间超过阀值的语句。

具体指运行时间超过long_query_time值的sql,则会被记录到慢查询日志中。long_query_time默认是10s。

如何玩

默认情况下,Mysql数据库没有开启慢查询日志,需要我们手动来设置这个参数。

当然,如果不是调优需要的话,一般不建议启动该参数,因为慢查询日志会或多或少代来一些性能影响。慢查询日志支持将日志记录写入文件。

查看当前是否开启

1
2
3
4
5
6
mysql> SHOW VARIABLES LIKE '%slow_query_log%';

Variables_name | Value
slow_query_log | OFF
slow_query_log_file | /var/lib/mysql/slow.log
2 rows in set (0.00 sec)

开启

1
2
3
4
5
6
7
8
9
# 使用以下语句只对当前数据库生效,mysql重启后则失效
set global_slow_query_log=1;

# 永久生效,修改配置文件my.cnf(增加或修改以下两个字段)
# 如果没有指定 slow_query_log_file,系统默认host_name-slow.log
# 重启mysql服务。
[mysqld]
slow_query_log=1
slow_query_log_file=/var/lib/mysql/slow.log

参数修改

1
2
3
4
5
6
7
8
9
10
11
# 默认查询时间超过这个参数的时间,就会被记录到慢查询日志中。默认为10s
mysql> SHOW VARIABLES LIKE 'long_query_time%';

long_query_time | 10.000000


# 可以通过set 在当前数据库生效,mysql重启后失效。也可以在my.cnf中修改。

set global long_query_time=3;

注: 此时需要重新开一个会话才能看到修改的值。

模拟慢查询

1
2
# 模拟一个4s的查询sql
select sleep(4);

日志分析工具

mysqldumpslow

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysqldumpslow --help

-s: 是表示访问按照何种方式排序
c: 访问次数
l: 锁定时间
r: 返回记录数
t: 查询时间

al: 平均锁定时间
ar: 平均返回记录数
at: 平均查询时间

-t: 即为返回前边多少条的数据
-g: 后边搭配一个正则匹配模式,大小写不敏感

常用场景

1
2
3
4
5
6
7
8
9
10
11
# 得到返回记录集最多的10个SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/host_name-slow.log

# 得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/host_name-slow.log

# 得到按照时间排序的前10条里边含有做链接的查询语句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/host_name-slow.log

# 建议在使用这些命令时结合| 和 more 使用,否则可能出现爆屏
mysqldumpslow -s r -t 10 /var/lib/mysql/host_name-slow.log | more