首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MySql学习笔记(五)- 使用ShowProfile分析Sql

MySql学习笔记(五)- 使用ShowProfile分析Sql

作者头像
写一点笔记
发布于 2020-11-10 13:17:50
发布于 2020-11-10 13:17:50
8400
举报
文章被收录于专栏:程序员备忘录程序员备忘录

上期文档中我们让mysql开启慢查询日志,收集查询时间比较长的sql,进而通过explain指令查询sql的执行过程,explain能够查看sql是那种数据查询方式以及索引情况。但是有时候使用explain还是无法定位到问题sql,所以在mysql5.037版本之后新增了show profiles和show profile语句的支持,通过hava_profileing指令可以查看当前sql是否支持profiles。

profiles默认是关闭的,可以通过set语句在session级别开启profiling

代码语言:javascript
复制
set profiling=1;

通过profle,我们能够更清楚的了解sql的执行过程,例如我们知道myisam表有表元数据的缓存 ,那么对一个myisam表的count(*)就不需要消耗太多的资源。但是对于innodb来说,就没有这种元数据的缓存,count(*)照顾徐不够的就比较慢。

这里我们可以做个实验。

通过show profile for query语句能够看到执行过程中线程的每个状态和消耗的时间。

注意这里的sending data状态表示mysql线程开始访问数据并把结果返回给客户端,而不仅仅是返回结果给客户端。由于在seding data状态下,mysql往往需要做大量的磁盘读取操作,所以经常是整个查询中耗时最行的状态。

通过仔细观察,我们发现count(*)的过程中,时间主要消耗在sending data这个状态,为了更清晰的看到排序结果,可以查询information_schema.profiling表并按照时间做倒序;

代码语言:javascript
复制
set @query_id:=9;
select state,
       sum(duration) as total_r,
       round(100*sum(duration)/(select sum(duration) from information_schema.profiling where query_id=@query_id),2) as pct_r,
       count(*) as calls,
       sum(duration)/count(*) as 'r/call'
from information_schema.profiling
where query_id=@query_id
group by state
order  by total_r desc;

在获得最消耗时间的线程之后,mysql进一步选择all、cpu、block io、context switch、page faults等明确类型来查看mysql在使用资源上消耗了过高的时间。例如查看cpu消耗的时间

代码语言:javascript
复制
show profile cpu for query 9;
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档