Mysql-性能分析-Profiling,查看sql语句执行时间

作者: JONE 分类: PHPer 发布时间: 2020-06-08 16:28

来源:https://www.jianshu.com/p/36b35f84ccde

是什么

Show Profile是mysql提供可以用来分析当前会话中语句执行的资源消耗情况,可以用于Sql调优的测量。

怎么玩

  1. 先查看是否开启了此功能:show variables like 'profiling%';
    默认情况下,参数出于关闭状态,为OFF状态
  2. 开启Profilingset profiling=1;
    开启此功能后,就能执行我们的SQL语句
  3. 展示最近的SQL执行情况:show profiles;
    此命令展示最近执行的sql语句,默认是15次,一个示例如下:

    展示最近的15条

    Query_ID会一直递增,后期我们会使用这个id,来具体查询某一条SQL的执行耗时清单

  4. 具体查看某一条SQL的执行细节:show profile cpu,block io for query 8;
    如下图为查询id=8的这条sql的执行细节,此处查询了cpublock io这两种类型,其他可以选择的类型在图的下面展示:

    SQL执行具体细节

    可以使用的类型如下:

ALL;显示所有的开销信息
BLOCK IO:显示块IO相关开销
CONTEXT SWITCHES:上下文切换相关开销
CPU:显示CPU相关开销
IPC:显示发送和接受相关开销
MEMORY:显示内存相关开销
PAGE FAULTS:显示页面错误相关开销
SOURCE:显示和Source_function, Source_file,Source_line相关的相关开销
SWAPS:显示交换次数相关开销

应该重点关注什么

请读者继续看前面的图SQL执行具体细节,左边Status列展示了一条SQL执行的从开始到清理的整个生命周期中执行的操作。如果在其生命周期阶段出现如下的情况的就要重视了:

  1. converting HEAP to MyISAM :查询结果太大,内存都不够用了往磁盘上面搬了
  2. Creating tmp table :创建了临时表,先拷贝到临时表,用完后再删除
  3. Copying to tmp table on disk:把内存中的临时表复制到磁盘中,这个很耗性能
  4. locked :这个就是指在等待锁的意思
    可以看看如下Creating tmp table的样例

    Creating tmp table的样例

总结

开启Profiling后,mysql会留下15条最近执行的sql的现场, 便于我们发现问题。

Show profiles用来查最近的15条。

Show profile用来展示每一个SQL执行阶段的耗时清单,便于我们发现耗时最多的地方,然后以此为依据查找问题所在,最后优化SQL或者优化mysql参数。比如耗时清单创建了临时表,就要考虑表是否创建索引,如果创建了那么是否没有用到或者失效了。

总的来说Profiling是一个很不错的mysql性能分析工具。