文章目录
MySql 慢查询分析
一、慢查询配置
- 慢查询默认关闭,相关配置如下:
配置 | 说明 | 默认值 |
---|---|---|
slow_query_log | 记录慢查询日志开关 | OFF |
slow_query_log_file | 指定慢查询日志存储路径和文件 | 默认和数据文件在一个路径 |
long_query_time | 指定慢查询SQL执行阈值 | 10秒 |
log_queries_not_using_indexes | 是否记录未使用索引的SQL | OFF |
log_output | 日志存放的地方TABLE或者FILE, 使用table的时候,会存到mysql库的slow_Log表里面,不推荐修改,保持默认即可 | FILE |
1.1 查询
SHOW VARIABLES
WHERE
variable_name IN (
'slow_query_log',
'slow_query_log_file',
'long_query_time',
'%log_queries_not_using_indexes%',
'log_output'
);
- 结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PxtAlK2V-1576570988812)(https://note.youdao.com/yws/api/personal/file/A336F0AE04A34CD88FEB405A8257AB96?method=download&shareKey=d81a28056f50da58216a103f2e68700e)]
1.2 修改
set global slow_query_log= 1/0 ;
show VARIABLES like '%datadir%'; //查询数据文件存储路径
set global slow_query_log_file= 'E:\\slow.log';//修改慢查询日志保存路径
set global log_queries_not_using_indexes= 0/1; //没有使用索引的查询是否需要记录
set global long_query_time= 0.2; //设置阈值为200毫秒,注意修改后,在新的session中才能查询到新的值,后续就能生效了,如果要保证重新后也能生效,需要写到my.ini文件
- 配置了慢查询后,它会记录符合条件的SQL
包括:
新增语句
查询语句
数据修改语句
已经回滚得SQL
二、慢查询分析
2.1 日志内容
- 慢查询日志内容,如下是一条完整的慢查询日志
# User@Host: root[root] @ intellif-PC1161 [192.168.31.147] Id: 98
# Query_time: 0.000000 Lock_time: 0.000000 Rows_sent: 13 Rows_examined: 58
SET timestamp=1560936581;
SELECT
*
FROM
t_book,
t_gangs,
t_role
WHERE
t_role.bookId = t_book.id
AND t_role.gangsId = t_gangs.id
ORDER BY
t_role.power DESC;
- 相关信息使用表格展示如下
字段 | 含义 |
---|---|
User@Host | 用户名 、主机信息IP信息 |
Id | 线程ID号 |
Query_time | 执行花费的时间【单位:毫秒】 |
Lock_time | 执行获得锁的时间 |
Rows_sent | 获得的结果行数 |
Rows_examined | 扫描的数据行数 |
timestamp | SQL执行的具体时间 |
最后 | 具体的SQL语句 |
三、工具
3.1 mysqldumpslow
- mysqldumpslow是mysql自带的慢查询日志分析工具,它可以汇总除查询条件外其他完全相同的SQL,并将分析结果按照参数中所指定的顺序输出。
3.1.1 使用
- 语法:
mysqldumpslow -s r -t 10 slow-mysql.log
-s order (c,t,l,r,at,al,ar)
c:总次数
t:总时间
l:锁的时间
r:总数据行
at,al,ar :t,l,r平均数 【例如:at = 总时间/总次数】
-t top 指定取前面几天作为结果输出
mysqldumpslow.pl -s t -t 10 D:\DESKTOP-2EKGEE5-slow.log
3.1.2 示例
- 命令:./mysqldumpslow.pl -s -r -t 10 E:/slow.log -s order
- 抽取一条业务sql的统计结果:
Count: 2 Time=0.00s (0s) Lock=0.00s (0s) Rows=13.0 (26), root[root]@intellif-PC1161
SELECT
*
FROM
t_book,
t_gangs,
t_role
WHERE
t_role.bookId = t_book.id
AND t_role.gangsId = t_gangs.id
ORDER BY
t_role.power DESC
- 分析:这里展示的信息其实和2.1提到的类似。关于执行时间,加锁时间,获取行数,主机,sql等,mysqldumpslow主要的功能就是去重然后排序,
将相同的sql的信息合并并做一些排序帮助我们查看日志
3.1.3 缺点
- 必须登录mysql服务器。我们需要登录服务器获取慢查询日志文件。
- 没有执行计划。只能知道sql和执行耗费的时间,没法看到执行计划,不利于进一步的分析。
3.2 pt_query_digest
- pt_query_digest 第三方提供的一个是用于分析 mysql 慢查询的工具,相比 mysqldumpshow 来说 py-query_digest 的分析结果更完善具体。不过有点点遗憾
的是pt-query-digest 只支持Linux平台。
汇总的信息【总的查询时间】、【总的锁定时间】、【总的获取数据量】、【扫描的数据量】、【查询大小】
Response: 总的响应时间。
time: 该查询在本次分析中总的时间占比。
calls: 执行次数,即本次分析总共有多少条这种类型的查询语句。
R/Call: 平均每次执行的响应时间。
Item : 查询对象
3.3 mysqlsla
- 慢查询分析工具