MySQL 5.7中 performance_schema 替代 show profile 命令
本文出处: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 命令的更多相关文章
- MySQL的show profile(已过时)简介以及该功能在MySQL 5.7中performance_schema中的替代
本文出处:http://www.cnblogs.com/wy123/p/6979499.html show profile 命令用于跟踪执行过的sql语句的资源消耗信息,可以帮助查看sql语句的执行情 ...
- SQL中EXCEPT函数在 Mysql 和 sqlServer 中的替代方法
示例摘自:极客代码:http://wiki.jikexueyuan.com/project/sql/useful-functions/except-clause.html EXCEPT 子句 EXCE ...
- MySQL调优性能监控之show profile
用show profile查询工具指定具体的type show profile在mysql5.7之后过时 show profile命令用于跟踪执行过的sql语句的资源消耗信息,可以帮助查看sql语句的 ...
- MySQL中使用SHOW PROFILE命令分析性能的用法整理(配合explain效果更好,可以作为优化周期性检查)
这篇文章主要介绍了MySQL中使用show profile命令分析性能的用法整理,show profiles是数据库性能优化的常用命令,需要的朋友可以参考下 show profile是由Jerem ...
- MySQL存储引擎中的MyISAM和InnoDB区别详解
在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问.为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数 ...
- MySQL高级知识(十一)——Show Profile
前言:Show Profile是mysql提供的可以用来分析当前会话中sql语句执行的资源消耗情况的工具,可用于sql调优的测量.默认情况下处于关闭状态,并保存最近15次的运行结果. 1.分析步骤 # ...
- MySQL 5.6中如何定位DDL被阻塞的问题
在上一篇文章<MySQL 5.7中如何定位DDL被阻塞的问题>中,对于DDL被阻塞问题的定位,我们主要是基于MySQL 5.7新引入的performance_schema.metadata ...
- MySQL 5.7中如何定位DDL被阻塞的问题
在上篇文章<MySQL表结构变更,不可不知的Metadata Lock>中,我们介绍了MDL引入的背景,及基本概念,从“道”的层面知道了什么是MDL.下面就从“术”的层面看看如何定位MDL ...
- 【Mysql】—— MySQL存储引擎中的MyISAM和InnoDB区别详解
在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问.为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数 ...
随机推荐
- JS前端数据格式化
当我们从后台取了数据,但是我们希望在前台统一显示格式时,我们可能需要格式化数据. 今天正好总结一下前端JS格式化数据的几个方法: 1. toFixed() 方法 可把 Number 四舍五入为指定 ...
- JS函数与BOM
[函数的声明及调用]1.函数声明的格式:function 函数名(参数1,参数2,....){//函数体return结果;}函数名(参数1的值,参数2的值,....)>>>函数的调用 ...
- python库安装(numpy+scipy+matplotlib+scikit_learn)
python安装好后,库安装走了很多弯路,查了很多资料,终于安装成功,并且保存了该文章的地址,分享给大家 本人电脑windows 7,64位系统,安装的Python是3.5的,因此下载的库也是对应版本 ...
- tomcat的环境搭建
tomcat搭建过程还是比较简单的,只需要安装好jdk,然后配置好环境变量,最后把tomcat安装上开启就可以了. 首先下载jdk,然后把下载下来的jdk放到/usr/local下,然后用rpm -i ...
- 一、AspNet Core通过控制台编译程序的基本指令:
1.先创建文件夹 mkdir "文件夹"2.在对应的文件夹里边 用 dotnet new 命令创建了Program.cs和project.json俩个文件3.使用 dotnet r ...
- 蓝桥杯-马虎的算式-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- PHP学习笔记-4(时间戳)
在学习PHP时间戳的时候,发现了一个有趣的现象,就是发现用strtotime()这个函数返回的时间戳跟人家的不一样,以为是自己哪里写错了,后来发现不是这样的. 是因为设置的时区不同,从而导致了时间显示 ...
- Quartz (二) 和Spring整合
先给个场景:每五分钟扫描并关闭7天未付款的订单 1.quartz pom.xml依赖 <dependencies> <dependency> <groupId>or ...
- Play再识 - 不放弃的执着
从写Play初识时,前面各种称赞play如何如何解放java web开发,最后因为网络被墙而无法正常编译,从而想到放弃.从来都有成为web开发高手的想法,今天又再一次进行尝试,惊喜的是有新的进展. 首 ...
- 基于路由器物理接口的vlan间路由
广播域之间来往的数据包都是路由器中继的,所以vlan间的通信业需要路由器提供中继服务,这称作vlan间路由,可以用路由器或三层交换机实现. 配置R1: r1(config)#inter fa0/0r1 ...