SQL优化指南

慢查询日志 开启撒网模式

开启了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 点对点分析你

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="接单人员"

查询结果是:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值