参考文章
《数据库优化——慢查询MySQL定位优化流程》
《MySQL慢查询分析工具pt-query-digest详解》
写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。
我们将查询时间超出一定阈值的sql称为慢sql,mysql提供了慢sql日志帮助我们进行优化分析
慢sql相关参数:
(1)是否开启慢sql日志:slow_query_log
使用
set global slow_query_log=on;
开启慢sql记录
(2)慢sql阈值:long_query_time
使用
set global long_query_time=1;
记录查询时间大于1秒的sql
(3)慢sql日志路径:slow_query_log_file
默认slow.log,路径为mysql的data目录下
(4)是否记录未使用索引的查询 log_queries_not_using_indexes
记录未使用索引的sql:
set global log_queries_not_using_indexes=on
(5)sql扫描行数大于 min_examined_row_limit 时才记录
sql扫描行数大于100时才记录
set global min_examined_row_limit=100;
我们利用mysql日志分析工具对slow.log进行分析(慢sql只能记录已经查询完的sql,正在执行的慢sql则无法记录,
不过可以使用show full processlist查看正在运行的sql,不过这个更接近运维的范畴,这里不做深入讲解,有兴趣的
可以移步这里看下《MySQL show processlist说明》)
比如我们对2021年7月5日下午1点到5点的慢sql日志进行分析
pt-query-digest slow.log --since '2021-07-05 13:00:00' --until '2021-07-05 17:00:00' -->/tmp/slow_0705.report
--since 从什么时间开始分析,值为字符串,可以是指定的某个”yyyy-mm-dd [hh:mm:ss]”格式的时间点,也可以是简单的一个时间值:s(秒)、h(小时)、m(分钟)、d(天)
,如12h就表示从12小时前开始统计。
--until 截止时间,配合—since可以分析一段时间内的慢查询。
(1)第一部分:总体情况
Overall:查询总数、唯一查询数量、QPS、并发
Time range:查询的时间范围
Exec time :执行时间
Lock time:被阻塞时间
Rows sent:查询返回行数
Rows examine : 查询扫描行数
query size : 查询数据量
total:总计 min:最小 max:最大 avg:平均
95%:把所有值从小到大排列,位于95%的值
median:中位数,把所有值从小到大排列,位于中间的值
(2)第二部分:查询分组统计结果
Rank:所有语句的排名,默认按查询时间降序排列
Query ID:查询的ID (有说法是sql id 去掉空格和文本字符后计算的hash)
Response:总执行时间
time:该查询在本次分析中总的时间占比
calls:执行次数,即本次分析总共有多少条这种类型的查询语句
R/Call:平均每次执行的响应时间
V/M:响应时间Variance-to-mean的比率
Item:查询对象(记录了查方法与涉及到的表等信息)
(3)第三部分:每个查询的详细统计结果
Query:对应第二部分中的Rank排名
ID:查询ID号,即第二部分中的Query ID对应
Time range:查询时间范围
Attribute:针对此类查询的统计
Databases:数据库名
Hosts:执行查询的IP分布(占比)
Users:各个用户执行的次数(占比)
Query_time distribution :查询时间分布, 长短体现区间占比。
Tables :查询中涉及到的表
EXPLAIN :显示具体的sql
在分析完后,我们确定了存在异常的sql,那么接下来就要对其进行进一步的解析与优化。
之前在索引介绍里简单介绍了下explain,这里再做下补充
使用explain对慢sql分析日志中的异常sql再进行详细分析,就可以有针对性的进行sql优化,
比如是调整sql写法还是增加索引。