本文出处:http://www.cnblogs.com/wy123/p/6979499.html

  show profile 命令用于跟踪执行过的sql语句的资源消耗信息,可以帮助查看sql语句的执行情况,可以在做性能分析或者问题诊断的时候作为参考。
  在MySQL5.7中, show profile 命令已经开始不推荐使用,MySQL使用performance_schema 中系统表的信息来替代show profile命令
  本文简单介绍一下MySQL的profile使用,以及在MySQL5.7之后的改进,同时与SQL Server中的DMV以及profile和扩展事件做一个简单的对比,
  最后会发现,在MySQL和SQL Server中这个信息反映出来的指标都和以及参考作用,都是类似的。

MySQL5.7尚且支持的show profile

  show profile在MySQ L5.7之后就开始是一个过时的选项,不过MySQL 5.7尚且支持,不过不建议使用。show profile跟踪记录SQL执行情况的需要打开配置才能使用

  

  测试执行数次“select count(1) from test_table1;”这个SQL语句,查看执行过的sql的QUERY_ID

  

  然后查看具体的某一个query_id的执行过程

  

  然后可以查看某一个query(执行过的SQL语句)的某一方面的资源消耗信息。
  比如show profile cpufor query 82或者是show profile all for query 82;

  

  或者是show profile all for query 82。更多show profile的参数请参考各种参考资料以及官方文档。

  

  show profile中记录的信息实际上是存储在INFORMATION_SCHEMA.PROFILING 这个系统表中的,
  各种show profile只不过是相当于一个马甲,换一种方式来展现INFORMATION_SCHEMA.PROFILING 中的信息。
  实话讲,个人是不太喜欢系统类似的封装命令的,倒不如自己直接去定义查询条件去查询系统表本身来的更加实在。

  MySQL的show profile差不多就是这个功能。
  细节功能要么用的非常非常频繁,然后自然会熟悉,要么就用的时候查一下。

-- 打开当前Session的profiling
set profiling = 1; -- 查询最近一个查询的profiling信息
show profile; -- 查询所有的profile信息
show profiles; -- 查询某个Id的profile信息
show profile for query 5; -- 查询某个Id的profile指定信息
show profile cpu for query 5;

MySQL5.7之后的performance_schema 替代 show profile

  首先参考官方文档https://dev.mysql.com/doc/refman/5.7/en/performance-schema-query-profiling.html

  个人理解起来就是将原先存储在INFORMATION_SCHEMA.PROFILING系统表中的信息换了一个存储的方式个位置。
  这个过程也是支持可配置化的,首先看 performance_schema.setup_actors这个系统表,默认情况下是开启了profile跟踪记录的。

  

  可以在全局级关闭profile记录跟踪的功能,而只限定某一个账号的执行记录被跟踪

  

  这里就重新建账号了,重现打开默认情况下记录所有账号的跟踪。
  然后根据官网的提示,需要打开一个配置选项才能正常记录profile信息。
  执行如下sql。

UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE '%statement/%'; UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE '%stage/%'; UPDATE performance_schema.setup_consumers SET ENABLED = 'YES'
WHERE NAME LIKE '%events_statements_%'; UPDATE performance_schema.setup_consumers SET ENABLED = 'YES'
WHERE NAME LIKE '%events_stages_%';

继续使用上述的sql查询语句(select count(1) from test_table1)做测试,
   然后系统表performance_schema.events_statements_history_long 中可以根据文本信息模糊匹配出之前执行过的SQL语句的信息了

  根据上述匹配到的sql语句的Event_id就可以查询到这个SQL语句在执行过程中的资源消耗信息了。

  

SELECT EVENT_ID, TRUNCATE(TIMER_WAIT/1000000000000,6) as Duration, SQL_TEXT
FROM performance_schema.events_statements_history_long
WHERE SQL_TEXT like '%select count(1) from test_table1%'; SELECT event_name AS Stage, TRUNCATE(TIMER_WAIT/1000000000000,6) AS Duration
FROM performance_schema.events_stages_history_long
WHERE NESTING_EVENT_ID=544102;

  但是performance_schema 系统表中记录到的信息,并不能像show profile cpu for query *** 一样,查询出来某一类资源的消耗情况。
  本身还没有搜索到相关的等价于show profile cpu for query *** 的系统表,有知道的还望告知,谢谢。
  到时某些资料上有这么一说,在performance_schema 系统表记录到的信息中:“Does not cover all metrics compared to the native profiling i.e. CONTEXT SWITCHES, BLOCK IO, SWAPS”
  也就说相比之前版本的show profile,新的记录profile的方式还是有待完善的,不知道到目前为止有没有完善这个功能。
  参考:https://www.percona.com/blog/2015/04/16/profiling-mysql-queries-from-performance-schema/

格式化个时间都费劲巴拉的

--历史记录数据量的配置
show variables like 'performance_schema%history%size'; SELECT
EVENT_ID,
date_sub(now(),INTERVAL (select VARIABLE_VALUE from information_schema.global_status where variable_name='UPTIME')-TIMER_START*10e-13 second) `start_time` ,
date_sub(now(),INTERVAL (select VARIABLE_VALUE from information_schema.global_status where variable_name='UPTIME')-timer_end*10e-13 second) `start_time` ,
TRUNCATE(TIMER_WAIT/1000000000000,6) as Duration,
SQL_TEXT
FROM performance_schema.events_statements_history_long
WHERE SQL_TEXT like '%test_mrr%'; SELECT event_name AS Stage, TRUNCATE(TIMER_WAIT/1000000000000,6) AS Duration
FROM performance_schema.events_stages_history_long
WHERE NESTING_EVENT_ID=48903;

     MySQL中的show profile中的信息大概就是这样子,
  参考了一下《深入浅出MySQL》发现提到的show profile在执行的执行给出了警告,表明后续版本中可能会移除这个功能,因此又搜索show profile的替代者。

MySQL的profile信息与SQL Server中的profile简单的对比

最后简单地与sqlserver系统表DMV中的类似功能做一下比较,还是有一些比较相似的地方的。
SQL Server可以通过DMV来查询执行过的SQL的一些信息,比如执行的时间,消耗的CPU时间,执行的逻辑读写,物理读写等等
不过这个结果还是有一些不一样的,下面再说。

  上述MySQL统计出来的是一个结果强调的是步骤与时间的维度,也即每一步花费了多少时间,
  这里的sqlserver统计出来的是一个整体消耗信息
  如果sqlserver想到达到类似也是可以的,最简单的就是SQL Server中的profile跟踪结果,也叫profile,看来套路都是一样的,
  另外就是sqlserver中改良过来的扩展事件,参考之前的博文:http://www.cnblogs.com/wy123/p/6835939.html
  完全可以拿到Session级别的等待资源和等待时间,这样子基本上就等同于MySQL中的performance_schema记录到的信息了。
  不过SQL Server 扩展事件捕获到的这个信息要比MySQL的原始的Profile中INFORMATION_SCHEMA.PROFILING 的更加具体和详尽了。
  在资源消耗和时间维度上有一个更加清晰和直观的结果。
  比如如下的这个截图,还是那句话,套路都是一样的,换了个马甲而已。

  

  如果把扩展事件捕获到的上述结果,统计起来看,就更像MySQL中的profile信息了。

  

总结:

  profile跟踪结果可以反馈出来sql执行过程中的资源消耗信息,以提供在做性能优化或者是问题诊断过程中的参考依据,作为DBA在管理和优化数据中的工具
  不管是在MySQL中,还是在SQL Server中,功能都是类似的。
  当然在问题诊断的时候,仅仅有这些信息,还是不完全够的,需要其他方面的一些信息做综合考量。

更多详细信息,参考:http://www.cnblogs.com/zhoujinyi/p/5236705.html

MySQL 5.7中 performance_schema 替代 show profile 命令的更多相关文章

  1. MySQL的show profile(已过时)简介以及该功能在MySQL 5.7中performance_schema中的替代

    本文出处:http://www.cnblogs.com/wy123/p/6979499.html show profile 命令用于跟踪执行过的sql语句的资源消耗信息,可以帮助查看sql语句的执行情 ...

  2. SQL中EXCEPT函数在 Mysql 和 sqlServer 中的替代方法

    示例摘自:极客代码:http://wiki.jikexueyuan.com/project/sql/useful-functions/except-clause.html EXCEPT 子句 EXCE ...

  3. MySQL调优性能监控之show profile

    用show profile查询工具指定具体的type show profile在mysql5.7之后过时 show profile命令用于跟踪执行过的sql语句的资源消耗信息,可以帮助查看sql语句的 ...

  4. MySQL中使用SHOW PROFILE命令分析性能的用法整理(配合explain效果更好,可以作为优化周期性检查)

    这篇文章主要介绍了MySQL中使用show profile命令分析性能的用法整理,show profiles是数据库性能优化的常用命令,需要的朋友可以参考下   show profile是由Jerem ...

  5. MySQL存储引擎中的MyISAM和InnoDB区别详解

    在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问.为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数 ...

  6. MySQL高级知识(十一)——Show Profile

    前言:Show Profile是mysql提供的可以用来分析当前会话中sql语句执行的资源消耗情况的工具,可用于sql调优的测量.默认情况下处于关闭状态,并保存最近15次的运行结果. 1.分析步骤 # ...

  7. MySQL 5.6中如何定位DDL被阻塞的问题

    在上一篇文章<MySQL 5.7中如何定位DDL被阻塞的问题>中,对于DDL被阻塞问题的定位,我们主要是基于MySQL 5.7新引入的performance_schema.metadata ...

  8. MySQL 5.7中如何定位DDL被阻塞的问题

    在上篇文章<MySQL表结构变更,不可不知的Metadata Lock>中,我们介绍了MDL引入的背景,及基本概念,从“道”的层面知道了什么是MDL.下面就从“术”的层面看看如何定位MDL ...

  9. 【Mysql】—— MySQL存储引擎中的MyISAM和InnoDB区别详解

    在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问.为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数 ...

随机推荐

  1. 烧录口被初始化为普通IO

    烧录口被初始化为普通IO后如果复位端没有的烧录口会导致不能识别烧录器不能下载与调试,因为程序一开始就把端口初始化了,烧录器不能识别,添加复位端口到烧录器(前提是你的烧录器有复位端). 有了复位段之后, ...

  2. 基于Prism.Windows的UWP开发备忘

    以前做UWP开发都是使用MvvmLight,主要是简单易上手,同时也写了很多MvvmLight的开发系列文章: UWP开发必备以及常用知识点总结 UWP开发之Mvvmlight实践九:基于MVVM的项 ...

  3. java写文件读写操作(IO流,字符流)

    package copyfile; import java.io.*; public class copy { public static void main(String[] args) throw ...

  4. Linux-进程描述(5)之进程环境

    main函数和启动例程 当内核使用一个exec函数执行C程序时,在调用main函数之前先调用一个特殊的启动例程,可执行程序将此例程指定为程序的起始地址.启动例程从内核获取命令行参数和环境变量,然后为调 ...

  5. Linux基础(7)

    Linux 基础(7) 一.内存的监控(free) free -m 以单位为MB的方式查看内存的使用情况(free命令读取的文件是/proc/meminfo) total:是指计算机安装的内存总量 u ...

  6. js倒计时,秒倒计时,天倒计时

    按天倒计时 HTML代码1: <Script Language="JavaScript"> <!-- Begin var timedate= new Date(& ...

  7. 微坑---微信小程序ios上时间字符串转换为时间戳时,在开发工具上和安卓手机上运行成功

    给定一个时间字符串  var time="2017-02-27 16:42:53" js有三种转换为时间戳的方法:1.var timestamp = Date.parse(time ...

  8. Java爬虫(一)利用GET和POST发送请求,获取服务器返回信息

    本人所使用软件 eclipse fiddle UC浏览器 分析请求信息 以知乎(https://www.zhihu.com)为例,模拟登陆请求,获取登陆后首页,首先就是分析请求信息. 用UC浏览器F1 ...

  9. selenium 远程服务设置

    第一步:将浏览器的安装地址以及浏览器的驱动地址添加到系统变量path中.浏览器只需要添加此浏览器exe文件所在的目录就可以,驱动需要添加完整的地址包括驱动本身XXX.exe. 第二步:需要安装jdk环 ...

  10. vue2.0结合Element实现select动态控制input禁用

    今天有一个盆友问小颖,怎么实现用select动态控制input禁用,也就是说,input默认是可编辑的,但是每当我选一次select,input就会变成禁用,虽然小颖不知道她为什么这样做,因为小颖觉得 ...