2018-12-13 15:27 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="接单人员" |
查询结果是:
这就是这条SQL的执行计划,下面来说明一下这个执行计划怎么看
id:代表优先级 id值越大,越先执行,id值相同,从上往下执行。(比如示例的这条sql的执行计划,就是先执行第一行,再执行第二行)
select_type:表示select类型 取值如下
simple 简单表 即不使用表连接或者子查询
primary 包含union或者子查询的主查询 即外层的查询
union UNION中的第二个或者后面的查询语句
subquery 一般子查询中的子查询被标记为subquery,也就是位于select列表中的查询
derived 派生表 该临时表是从子查询派生出来的
等等
豫ICP备18042703号-1 boss@bigly.cn
Copyright(C)buwangkeji.com, All Rights Reserved. 洛阳市 洛龙区 东方今典(天汇中心) 2005