一:什么是慢SQL
1、开启慢查询记录
通过命令查看慢查询日志是否开启。OFF代表关闭,ON代表开启。
show variables like '%slow_query_log%';
结果为OFF,表明当前为关闭状态。
我们可以使用命令开启慢查询。
set global slow_query_log=1; -- 1代表开启,0代表关闭
2、如何定义慢SQL
通过命令查看慢查询SQL的设置时间。
show variables like 'long_query_time';
默认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%';
通过命令查看慢查询日志的记录位置。
二:如何分析慢SQL
使用MySQL的explain执行计划来模拟优化器对SQL语句进行分析,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。详见如何阅读 Explain 执行计划
通过一个模糊查询,来产生慢SQL日志。
SELECT * FROM emp where ename like '%mQspyv%';
多次执行上面的查询语句后,使用show status like "%slow%"可以发现产生几次慢查询。
工具一:使用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文件。
发现mysqldumpslow是一个Perl源文件,需要Perl软件才能执行该文件脚本,所以,首先我们需要在windows下安装Perl,安装过程很简单,从官网 strawberryperl.com/ 下载windows安装包,安装好之后,测试perl -v,如果能显示版本号,表示安装成功。
安装完成后,定位到mysqldumpslow.pl文件所在目录,执行perl mysqldumpslow.pl --help获取帮助文档。
对参数简单说明:
-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语句。
工具三:使用pt-digest-query工具查询
由于在官网上传送门没有找到windows环境的安装包,此处就不做具体说明,有兴趣可以自行查找下操作文档。
三:如何进行慢SQL优化
这部分涉及到内容较多,涉及到前期数据规划,后期explain进行执行计划的分析等。此处不具体展开,后面SQL优化环节会详细说明。