SQL优化指南

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

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

注:本文转载自布网信息科技,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除。
  • 波浪
  • 波浪
  • 波浪
  • 波浪