开发者学堂课程【MySQL 实操课程:慢查询定位具体 SQL 语句】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/717/detail/12829
慢查询定位具体 SQL 语句
内容介绍
一、MySQL 客户端慢查询定位
二、RDS 管理后台慢查询定位
接下来进行讲解第二部分的内容,如何通过慢查询定位找到 SQL 语句,本身MySQL 也提供了这样的机制去配置慢查询策略,下面进行讲解慢查询是什么和如何去定位。
一、MySQL 客户端慢查询定位
1、定位慢查询
(1)慢查询意在将SQL执行时间超过预设的阈值,会被记录下来。
(2)MySQL 查看慢查询参数配置。
(3)RDS For MySQL 提供了可视化的参数修改方式。
(4)为了方便看到慢查询效果,将该值调整了0.0001
就是说对于所有的 SQL 语句,在执行增删改查的过程中可以通过 MySQL 的配置时间,比如配置为一秒那么,所有超过一秒的时间就会写入慢查询,便于后续去跟踪分析慢查询全日志文件,通过慢查询日志文件,可以快速的定位找到对应 SQL 语句,然后针对 SQL 语句进行,详细的分析优化,这就是慢查询为什么要去进行定位的作用。
2、案例演示
那么通过 MySQL 怎样去进行一个慢查询的配置,如下:
mysql> show variables like '%long_query_time%' ;
//这是一个系统变量
Variable name Value
long_ query_ time 1.000000
1 row in set (0.00 sec)
首先打开阿里云工具,然后远程登录服务器找到公网的 ip:
shell@Alicloud:~$ ssh root@47.112.159.55
[root@iZwz9bize6nk8hug8jOvywZ ~]# ps -ef|grep mysqld
此时 mysql 服务已经启动。然后进入到 MySQL 的客户端,然后找到变量long_query_time,可以看到阙值设定为0.5:
[root@iZwz9bize6nk8hug8jOvywZ ~]# /usr/local/mysql/bin/mysql -uroot -p
mysql> show variables like '%long_query_time%' ;
…
long_query_time 0.500000
…
对于是在哪里配置的,可以重新打开一个客户端,打开 MySQL 的配置文件,可以看到 slow 实际上是启动了慢查询日志的,并且指定了慢查询日志,慢查询时间为0.5秒:
shell
@Alicloud:~$ ssh root@47.112.159.55
[root@iZwz9bize6nk8hug8jOvywZ ~]#
vi
/etc/my.cnf
…
s
low_query_log=1
s
low_query_log_file=/data/mysql/slow.log
l
og-error=/data/mysql/error.log
l
ong_query_time=0.5
…
然后进行查看慢查询的日志,可以看到之前建立的查询日志 slow.log:
[root@iZwz9bize6nk8hug8jOvywZ ~]# cd /data/mysql
[root@iZwz9bize6nk8hug8jOvywZ mysql]# ll
…
-rw-r----- 1 mysql mysql 736 Aug 21 01:25 slow.log
…
打开后可以看到内容为之前建立连接生成的慢查询,为了方便测试可以把时间改小一点,首先先删除之前的 slow 日志,然后将阙值设置为0.001,改完配置后保存退出进行重启,重启之后再进行打开:
[root@iZwz9bize6nk8hug8jOvywZ mysql]# vi slow.log
[root@iZwz9bize6nk8hug8jOvywZ mysql]# rm -rf slow.log
[root@iZwz9bize6nk8hug8jOvywZ mysql]# vi slow.log
…
long_query_time=0.001
…
[root@iZwz9bize6nk8hug8jOvywZ mysql]# usr/local/ mysql/bin/mysqladmin shutdown -uroot -p
[root@iZwz9bize6nk8hug8jOvywZ mysql]# /usr/local/mysql/bin/mysqld_safe /etc/my. cnf&
[root@iZwz9bize6nk8hug8jOvywZ mysql]# ps -ef|grep mysqld
此时再去执行系统变量,则会看到时间为0.001秒,此时慢查询日志已经生成,然后进入 MySQL 找到慢查询日志 slow.log,打开后发现 show databases 表示做了慢查询,并将所有慢查询语句写入到日志中:
mysql> show variables like '%long_query_time%' ;
…
long_query_time 0.001000
…
[root@iZwz9bize6nk8hug8jOvywZ mysql]# vi slow.log
…
show databases
打开 user 表可以看到表中存在之前创建的索引,进行后执行 begin 开启一个事务,然后重新打开一个窗口进行执行,再向 user 表中写入数据可以发现被阻塞,写入失败因为超时:
mysql> select * from user;
mysql> show create table user;
mysql>begin;
shell@Alicloud:~$ ssh root@47.112.159.55
[root@iZwz9bize6nk8hug8jOvywZ ~]# /usr/local/mysql/bin/mysql -uroot -p
mysql> use aliyun;
mysql> select * from user;
update user set name= 'wangwu1' where score=90;
mysql> begin;
mysql> update user set name= 'wangwu1' where score=90;
Query OK,1 row affected (0.00 sec)
Bows matched:1 Charged:1 Warnings:0
mysql> commit;
再打开日志文件,可以看到里面的数据重新打印出来,commit 操作也可以检测出慢查询:
[root@iZwz9bize6nk8hug8jOvywZ mysql]# tail -f -n 100 slow.log
…
commit;
所以这个里面是会记录出慢查询,也就是可以写入一些模拟数据,去执行慢查询,这里面的 commit 也是记录下了慢查询语句,正常的话是直接执行:
mysql> rollback;
Query OK,0 row affected (0.00 sec)
这就是针对慢查询检测的方法,需要注意要开启 cnf 配置的 slow_query_log=1 慢查询,并且要指定 file 文件是 slow.log 和慢查询时间为多少。
二、RDS 管理后台慢查询定位
1、后台慢日志操作
rds 实际上也提供了一些管理平台,下面讲解 rds 如何进行的操作。首先进入到 rds管理控制平台,然后找到参数设置找到 lang_query_time,可以进行修改:
而把鼠标放到 long_query_time 提示符上,可以看到提示作用为找到慢查询语句并且写到文件中:
然后修改值为0.1,点击提交参数并确认:
修改后进行刷新,可以发现时间变为0.1,说明修改成功,那么到底有没有修改成功?那么可以通过公网 IP 进入另一个客户端,然后连接 rds 里面的实例信息进行查看:
shell@Alicloud:~$ ssh root@47.112.159.55
[root@iZwz9bize6nk8hug8jOvywZ ~]# /usr/ local/ mysql/bin/mysql -hrm-wz9c2e2q42u426f3z.mysql .rds .aliyuncs.com -uroot -p
mysql> show variables like '%long_query_time%' ;
…
long_query_time 0. 100000
…
可以看到时间为0.1秒,说明上面的已经生效。时间是可以修改的,改完后可以通过他的慢查询日志设置的值,可以去分析并且收集慢查询日志,这就是 rds 下面提供的可视化修改参数。
2、慢日志统计
RDS For MySQL 管理后台,可到慢日志统计情况。在制备服务的功能下找到慢SQL,找到后可以根据慢 SQL 语句进行优化,这个慢 SQL 也是在之前配置了查询时间之后,超过这个时间的被统计出来的 SQL,包括打印出 SQL 模板和库名等一系列信息:
3、慢日志明晰
RDS For MySQL 管理后台,点击优化后就可以进入到优化的界面,即慢日志明细面板,优化界面中会列出明细,这就是所说的如何去定位: