前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySql学习笔记(五)- 使用ShowProfile分析Sql

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

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

上期文档中我们让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 删除

本文分享自 程序员备忘录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档