博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySql学习笔记(五)- 使用ShowProfile分析Sql
阅读量:4210 次
发布时间:2019-05-26

本文共 1169 字,大约阅读时间需要 3 分钟。

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

      

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

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表并按照时间做倒序;

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.profilingwhere query_id=@query_idgroup by stateorder  by total_r desc;

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

show profile cpu for query 9;

转载地址:http://dlkmi.baihongyu.com/

你可能感兴趣的文章
SD Card 驱动流程分析
查看>>
Linux之debugfs介绍
查看>>
Linux DebugFS 子目录也是用debugfs_create_dir来实现
查看>>
关于sd卡中一些概念的理解
查看>>
SD卡图形介绍
查看>>
linux MISC 驱动模型分析
查看>>
马达 vibrator的android的timed_output实现方式
查看>>
linux kernel panic解决思路
查看>>
定位Oops的具体代码行分析死机日志的方法
查看>>
Linux kernel oops panic 调试技巧
查看>>
sd是否在位检查
查看>>
关于USB Gadget开发
查看>>
tofel词汇
查看>>
jellybean的suspend策略变动
查看>>
Android linux的休眠和唤醒
查看>>
高通msm8x60 boot(lk)的usb处理解析流程
查看>>
MSM8260 EHCI-MSM72k主控制器的状态机迁移分析
查看>>
MSM8x60 OTG之设备控制器流程分析
查看>>
MSM8X60 USB控制器流程分析
查看>>
sd卡驱动分析之card
查看>>