如何对慢SQL追踪与定位

296 阅读3分钟

一:什么是慢SQL

1、开启慢查询记录

通过命令查看慢查询日志是否开启。OFF代表关闭,ON代表开启。

show variables like '%slow_query_log%'; image.png

结果为OFF,表明当前为关闭状态。

我们可以使用命令开启慢查询。

set global slow_query_log=1; -- 1代表开启,0代表关闭 image.png

2、如何定义慢SQL

通过命令查看慢查询SQL的设置时间。

show variables like 'long_query_time'; image.png

默认10s,SQL执行时间大于该时间的才是慢SQL,才会记录到慢查询日志中。

如果需要调整时间,可以执行如下命令。

set global long_query_time=5;

注意:使用命令 set global long_query_time=5修改后,需要重新连接或新开一个会话才能看到修改值。你用show variables like 'long_query_time'查看是当前会话的变量值,结果还会是10s,你也可以不用重新连接会话,而是用show global variables like 'long_query_time'。

3、查询慢查询SQL状况

show status like "%slow%";

Slow_queries 会显示当前一共存在多少条慢查询语句

show variables like '%slow_query_log_file%'; image.png

通过命令查看慢查询日志的记录位置。

二:如何分析慢SQL

使用MySQL的explain执行计划来模拟优化器对SQL语句进行分析,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。详见如何阅读 Explain 执行计划

通过一个模糊查询,来产生慢SQL日志。

SELECT * FROM emp where ename like '%mQspyv%';

image.png

多次执行上面的查询语句后,使用show status like "%slow%"可以发现产生几次慢查询。

image.png

工具一:使用sys库提供的视图查看

-- 查询按检索数据最多的全表扫描前20的sql语句:
SELECT
	QUERY,
	db,
	exec_count,
	total_latency,
	rows_examined
FROM
	sys.x$statements_with_full_table_scans
ORDER BY
	rows_examined DESC
LIMIT 20
-- 查询按排序做多的20条语句:
SELECT
	QUERY,
	db,
	exec_count,
	total_latency,
  rows_sorted
FROM
	x$statements_with_sorting
ORDER BY
	rows_sorted DESC
LIMIT 20
-- 查询按总延迟做多的20条语句:
SELECT
	QUERY,
	db,
	exec_count,
	total_latency,
	rows_examined
FROM
	x$statement_analysis
ORDER BY
	total_latency DESC
LIMIT 20

工具二:使用mysqldumpslow工具查看

打开mysql的安装目录,找到mysqldumpslow文件。

image.png

发现mysqldumpslow是一个Perl源文件,需要Perl软件才能执行该文件脚本,所以,首先我们需要在windows下安装Perl,安装过程很简单,从官网 strawberryperl.com/ 下载windows安装包,安装好之后,测试perl -v,如果能显示版本号,表示安装成功。

安装完成后,定位到mysqldumpslow.pl文件所在目录,执行perl mysqldumpslow.pl --help获取帮助文档。

image.png

对参数简单说明:

-s:表示按什么规则进行排序
  al:平均锁定时间
  ar:平均发送的行数
  at:平均查询时间
   c: 条数
   l:锁定时间
   r:发送的行数
   t:查询时间
-r:倒序排序
-t:显示top n条
-a:显示具体的数字和字符,默认按抽象显示,不显示具体的


参考例句:
-- 返回查询时间最多20条语句
mysqldumpslow -t 20 -s t slow202010204.log
-- 返回检索记录数最多20条语句 
mysqldumpslow -t 20 -s r slow202010204.log 
--返回按查询时间所有的语句
mysqldumpslow -s t slow202010204.log

本地实操的结果如下,会显示出具体的SQL语句。

image.png

工具三:使用pt-digest-query工具查询

由于在官网上传送门没有找到windows环境的安装包,此处就不做具体说明,有兴趣可以自行查找下操作文档。

三:如何进行慢SQL优化

这部分涉及到内容较多,涉及到前期数据规划,后期explain进行执行计划的分析等。此处不具体展开,后面SQL优化环节会详细说明。