2019-01-02 18:58 by 布网科技
原文出处: 不该相遇在秋天
开启了MySQL慢查询日志之后,MySQL会自动将执行时间超过指定秒数的SQL统统记录下来,这对于搜罗线上慢SQL有很大的帮助。
1 |
SHOW VARIABLES LIKE 'slow%' |
以我刚安装的mysql5.7为例 查询结果是这样子的:
slow_launch_time:表示如果建立线程花费了比这个值更长的时间,slow_launch_threads 计数器将增加
slow_query_log:是否开启慢查询日志 ON开启,OFF关闭 默认没有开启
slow_query_log_file:日志保存路径
1 |
SHOW VARIABLES LIKE 'long%' |
long_query_time:达到多少秒的sql就记录日志
客户端可以用set设置变量的方式让慢查询开启,但是个人不推荐,因为真实操作起来会有一些问题,比如说,重启MySQL后就失效了,或者是开启了慢查询,我又去改变量值,它就不生效了。
编辑MySQL的配置文件:
1 |
vim /etc/my.cnf |
加入如下三行:
1 2 3 |
slow_query_log=ON slow_query_log_file=/var/lib/mysql/localhost-centos-slow.log long_query_time=3 |
我这里设置的是3秒
重启MySQL
1 |
systemctl restart mysqld; |
服务器开一个监控:
1 |
tail -f /var/lib/mysql/localhost-centos-slow.log |
客户端走一条SQL:
1 |
SELECT SLEEP(3) |
此时发现sql已经被记录到日志里了。(有时候不一定,我看到很多博客讲的是超过指定秒数,但我实验得出的结果是达到指定秒数)
explain是一个神奇的命令,可以查看sql的具体的执行计划。
以一条联查sql为例:
1 2 3 4 |
SELECT a.id,a.cn_name,a.role_id,r.name FROM tb_usr_admins a INNER JOIN tb_base_roles r ON r.id=a.role_id WHERE a.cn_name="接单人员" |
查询结果是:
加上explain命令来执行:
1 2 3 4 5 |
EXPLAIN SELECT a.id,a.cn_name,a.role_id,r.name FROM tb_usr_admins a INNER JOIN tb_base_roles r ON r.id=a.role_id WHERE a.cn_name |