mysql for 语句执行顺序_MySQL使用profile分析SQL语句执行过程

分析SQL执行带来的开销是优化SQL的重要手段。在MySQL数据库中,可以通过配置profiling参数来启用SQL剖析。该参数可以在全局和session级别来设置。对于全局级别则作用于整个MySQL实例,而session级别紧影响当前session。该参数开启后,后续执行的SQL语句都将记录其资源开销,诸如IO,上下文切换,CPU,Memory等等。根据这些开销进一步分析当前SQL瓶颈从而进行优化与调整。本文描述了如何使用MySQL profile,不涉及具体的样例分析。

1、有关profile的描述

查看profiling系统变量

mysql> show variables like '%profil%';

+------------------------+-------+

| Variable_name          | Value |

+------------------------+-------+

| have_profiling         | YES   |  #只读变量,用于控制是否由系统变量开启或禁用profiling;

| profiling              | OFF   |  #开启或关闭SQL语句剖析功能;

| profiling_history_size | 15    |  #设置保留profiling的数目,缺省为15,范围为0至100,为0时将禁用profiling;

+------------------------+-------+

3 rows in set (0.00 sec)

获取profile的帮助

mysql> help profile;

Name: 'SHOW PROFILE'

Description:

Syntax:

SHOW PROFILE [type [, type] ... ]

[FOR QUERY n]

[LIMIT row_count [OFFSET offset]]

type:

ALL                #显示所有的开销信息;

| BLOCK IO           #显示块IO相关开销;

| CONTEXT SWITCHES   #上下文切换相关开销;

| CPU                #显示CPU相关开销信息;

| IPC                #显示发送和接收相关开销信息;

| MEMORY             #显示内存相关开销信息;

| PAGE FAULTS        #显示页面错误相关开销信息;

| SOURCE             #显示和Source_function,Source_file,Source_line相关的开销信息;

| SWAPS              #显示交换次数相关开销的信息;

2、开启porfiling

启用session级别的profiling

mysql> set profiling=1;

Query OK, 0 rows affected, 1 warning (0.00 sec)

验证修改后的结果

mysql> show variables like '%profil%';

+------------------------+-------+

| Variable_name          | Value |

+------------------------+-------+

| have_profiling         | YES   |

| profiling              | ON    |

| profiling_history_size | 15    |

+------------------------+-------+

3 rows in set (0.00 sec)

发布SQL查询

mysql> select * from zabbix.history_uint where clock<1488466329 limit 1;

查看当前session所有已产生的profile

mysql> show profiles;

+----------+------------+------------------------------------------------------------------+

| Query_ID | Duration   | Query                                                            |

+----------+------------+------------------------------------------------------------------+

|        1 | 0.00044625 | show variables like '%profil%'                                   |

|        2 | 6.43230200 | select * from zabbix.history_uint where clock<1488466329 limit 1 |

+----------+------------+------------------------------------------------------------------+

2 rows in set, 1 warning (0.00 sec)

我们看到有2个warning,之前一个,现在一个

mysql> show warnings;

+---------+------+--------------------------------------------------------------------------------------------------------------+

| Level   | Code | Message                                                                                                      |

+---------+------+--------------------------------------------------------------------------------------------------------------+

| Warning | 1287 | 'SHOW PROFILES' is deprecated and will be removed in a future release. Please use Performance Schema instead |

+---------+------+--------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

告警是说SHOW PROFILES命令将来会被Performance Schema替换掉。

3、获取SQL语句的开销信息

开启profiling后,我们可以通过show profile等方式查看,其实这些开销信息被记录到information_schema.profiling表中。注show profile之类的语句不会被profiling,即自身不会产生Profiling。

我们下面的这个show profile查看的是show warnings产生的相应开销。

mysq> show profile;

+----------------+----------+

| Status         | Duration |

+----------------+----------+

| starting       | 0.000141 |

| query end      | 0.000058 |

| closing tables | 0.000014 |

| freeing items  | 0.001802 |

| cleaning up    | 0.000272 |

+----------------+----------+

如下面的查询show warnings被添加到profiles

mysql> show profiles;

+----------+------------+------------------------------------------------------------------+

| Query_ID | Duration   | Query                                                            |

+----------+------------+------------------------------------------------------------------+

|        1 | 0.00041150 | show variables like '%profil%'                                   |

|        2 | 6.41118075 | select * from zabbix.history_uint where clock<1488466329 limit 1 |

|        3 | 0.00003900 | show warnings                                                    |

+----------+------------+------------------------------------------------------------------+

3 rows in set, 1 warning (0.00 sec)

获取指定查询的开销(Druation表示持续时间)

mysql> show profile for query 2;

+----------------------+----------+

| Status               | Duration |

+----------------------+----------+

| starting             | 0.000043 |

| checking permissions | 0.000004 |

| Opening tables       | 0.000014 |

| init                 | 0.000019 |

| System lock          | 0.000004 |

| optimizing           | 0.000009 |

| statistics           | 0.000062 |

| preparing            | 0.000012 |

| executing            | 0.000002 |

| Sending data         | 6.410967 |

| end                  | 0.000009 |

| query end            | 0.000005 |

| closing tables       | 0.000010 |

| freeing items        | 0.000011 |

| cleaning up          | 0.000011 |

+----------------------+----------+

15 rows in set, 1 warning (0.00 sec)

Sending data:这个状态的名称很具有误导性,所谓的“Sending data”并不是单纯的发送数据,而是包括“收集 + 发送 数据”。

query end:表示语句执行完毕了,但是还有一些后续工作没做完时的状态。

freeing items:释放查询缓存里面的空间,如果是DML操作,所以相应的缓存里的记录就无效了,所以需要有这一步做处理。

查看所有开销

mysql> show profile all for query 2 ;

查看特定部分的开销,如下为CPU部分的开销

mysql> show profile cpu for query 2 ;

如下为MEMORY部分的开销

mysql> show profile memory for query 2 ;

同时查看不同资源开销

mysql> show profile block io,cpu for query 2;

4、INFORMATION_SCHEMA.PROFILING

上面已经看到了,show profile命令即将移除,所以可以直接去information_schema.profiling表查看,灵活度更大,其表结构信息如下:

mysql> desc information_schema.profiling;

+---------------------+--------------+------+-----+----------+-------+

| Field               | Type         | Null | Key | Default  | Extra |

+---------------------+--------------+------+-----+----------+-------+

| QUERY_ID            | int(20)      | NO   |     | 0        |       |

| SEQ                 | int(20)      | NO   |     | 0        |       |

| STATE               | varchar(30)  | NO   |     |          |       |

| DURATION            | decimal(9,6) | NO   |     | 0.000000 |       |

| CPU_USER            | decimal(9,6) | YES  |     | NULL     |       |

| CPU_SYSTEM          | decimal(9,6) | YES  |     | NULL     |       |

| CONTEXT_VOLUNTARY   | int(20)      | YES  |     | NULL     |       |

| CONTEXT_INVOLUNTARY | int(20)      | YES  |     | NULL     |       |

| BLOCK_OPS_IN        | int(20)      | YES  |     | NULL     |       |

| BLOCK_OPS_OUT       | int(20)      | YES  |     | NULL     |       |

| MESSAGES_SENT       | int(20)      | YES  |     | NULL     |       |

| MESSAGES_RECEIVED   | int(20)      | YES  |     | NULL     |       |

| PAGE_FAULTS_MAJOR   | int(20)      | YES  |     | NULL     |       |

| PAGE_FAULTS_MINOR   | int(20)      | YES  |     | NULL     |       |

| SWAPS               | int(20)      | YES  |     | NULL     |       |

| SOURCE_FUNCTION     | varchar(30)  | YES  |     | NULL     |       |

| SOURCE_FILE         | varchar(20)  | YES  |     | NULL     |       |

| SOURCE_LINE         | int(20)      | YES  |     | NULL     |       |

+---------------------+--------------+------+-----+----------+-------+

18 rows in set (0.00 sec)

下面的SQL语句用于查询query_id为2的SQL开销,且按最大耗用时间倒序排列

mysql> set @query_id=2;

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;

+----------------------+----------+--------+-------+--------------+

| STATE                | Total_R  | Pct_R  | Calls | R/Call       |

+----------------------+----------+--------+-------+--------------+

| Sending data         | 6.410967 | 100.00 |     1 | 6.4109670000 |

| statistics           | 0.000062 |   0.00 |     1 | 0.0000620000 |

| starting             | 0.000043 |   0.00 |     1 | 0.0000430000 |

| init                 | 0.000019 |   0.00 |     1 | 0.0000190000 |

| Opening tables       | 0.000014 |   0.00 |     1 | 0.0000140000 |

| preparing            | 0.000012 |   0.00 |     1 | 0.0000120000 |

| cleaning up          | 0.000011 |   0.00 |     1 | 0.0000110000 |

| freeing items        | 0.000011 |   0.00 |     1 | 0.0000110000 |

| closing tables       | 0.000010 |   0.00 |     1 | 0.0000100000 |

| optimizing           | 0.000009 |   0.00 |     1 | 0.0000090000 |

| end                  | 0.000009 |   0.00 |     1 | 0.0000090000 |

| query end            | 0.000005 |   0.00 |     1 | 0.0000050000 |

| System lock          | 0.000004 |   0.00 |     1 | 0.0000040000 |

| checking permissions | 0.000004 |   0.00 |     1 | 0.0000040000 |

| executing            | 0.000002 |   0.00 |     1 | 0.0000020000 |

+----------------------+----------+--------+-------+--------------+

15 rows in set (0.01 sec)

停止profile,可以设置profiling参数,或者在session退出之后,profiling会被自动关闭。

转自:http://www.ywnds.com/?p=8677

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java jdbc 操作_Java:JDBC操作

内容&#xff1a;供程序员调用的接口与类&#xff0c;集成在java.sql和javax.sql包中&#xff0c;如&#xff1a;DriverManager类Connection接口Statement接口ResultSet接口1.Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");2.Connection conn Dri…

java 线程 函数_java – 从后台线程调用主线程上的函数

更新我已经更新了这个问题,使用建议的SwingWorker类包含Java实现的源代码,以实现与Objective-C示例相同的结果.希望这将有助于未来的冒险家.Document myDoc ...;Model myModel ...;SwingWorker analyzeDocument new SwingWorker() {Overridepublic Dictionary doInBackgroun…

java se5和8_javaSE_8系列博客——Java语言的特性(三)--类和对象(5)--定义方法...

以下是一个典型的定义一个方法的示例&#xff1a;public double calculateAnswer(double wingSpan, int numberOfEngines,double length, double grossTons) {//do the calculation here}方法声明的唯一必需元素是方法的返回类型&#xff0c;名称&#xff0c;一对括号()和大括号…

下面选项中不是开发java程序的步骤是_Java基础试题及其答案2

Java试题1) java程序中&#xff0c;main方法的格式正确的是()。(选择一项)a)static void main(String[] args)b)public void main(String[] args)c)public static void main(String[]s)d)public static void main(String[] args)2)给定java代码&#xff0c;如下&#xff1a;pub…

java java.doc_使用 javadoc 自动生成 Java 文档

Java 的注释&#xff0c;单行&#xff0c;多行的语法就不在赘述了。javadoc tags给 Java 源码文件书写注释&#xff0c;使用常见的 Java 注释可以实现一些&#xff0c;也可以通过如下的 Javadoc 的 Tags 来实现一些特殊的比如跳转&#xff0c;参数返回值等特殊标记。javadoc 标…

java增删改一键生成_easyCode(java自动生成增删改查代码)

【实例简介】读取数据库表结构 自动生成增删改查代码【实例截图】【核心代码】package com.isoftstone.autocoding;import com.isoftstone.autocoding.common.Column;import com.isoftstone.autocoding.common.Table;import com.isoftstone.autocoding.utils.CamelCaseUtils;im…

java8.0 platform图_Java Platform SE binary语言-Java编程32位/64位版(jdk-jeb)下载V8.0.2510.8官方安装版-西西软件下载...

Java编程32位/64位版(jdk-jeb)是一款功能强大的计算机编程语言工具&#xff0c;Java技术让您可以在安全的计算环境下工作和游戏。使用 Java您可以畅玩网络游戏、与世界各地的朋友聊天、计算按揭利息&#xff0c;还可以在 3D 模式下浏览图像&#xff0c;诸多功能不一而足。软件特…

java同时关闭两个窗口_在一个窗口中同时关闭多个窗口的问题(Swing中事件多点传送的问题) | 学步园...

class A{}A中包含有&#xff1a;JFrame frameA;JButton btnA;class B{}B中包含有&#xff1a;final JFrame frameB;Static boolean wantToSave true;frameB.addWindowListener( new WindowAdapter(){pubilic void windowClosing(windowEvent we…

JAVA数组扁平化整合_5种方法实现数组扁平化

数组扁平化概念数组扁平化是指将一个多维数组变为一维数组[1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5]复制代码实现1. reduce遍历数组每一项&#xff0c;若值为数组则递归遍历&#xff0c;否则concat。function flatten(arr){return arr.reduce((result, item)> {retur…

java 线程由浅入深_由浅入深,Java 并发编程中的 Synchronized(一)

synchronized 作用synchronized 关键字是 Java 并发编程中线程同步的常用手段之一。1.1 作用&#xff1a;确保线程互斥的访问同步代&#xff0c;锁自动释放&#xff0c;多个线程操作同个代码块或函数必须排队获得锁&#xff0c;保证共享变量的修改能够及时可见&#xff0c;获得…

java私有变量和_java – 大内部类和私有变量

有一件事我经历了几次,是一个服务类(如JBoss服务),由于助手内部类,它已经变得过大了.我还没有找到打破班级的好办法.这些助手通常是线程.这里有一个例子&#xff1a;/** Asset service keeps track of the Metadata about assets that live on other* systems. Complications i…

java long.max_value,Long + Long不大于Long.MAX_VALUE

If I have an assignmentLong c a b;Is there an easy way to check that a b is not bigger/smaller than Long.MAX_VALUE/Long.MIN_VALUE?解决方案Using Guava, its as simple aslong c LongMath.checkedAdd(a, b); // throws an ArithmeticException on overflowwhich …

php从内存中获取源码_PHP源码分析之变量的存储过程分解

PHP代码如下&#xff1a;$php_var 1;对应C的代码是&#xff1a;zval* c_var; //定义PHP变量指针MAKE_STD_ZVAL(c_var); //初始化PHP变量ZVAL_LONG(c_var,1) ;//赋值ZEND_SET_SYMBL( EG(active_symbol_table), " php_var ", c_var);//注册到全局变量符号表一&…

php有哪些高级扩展,php扩展有哪些

什么是PHP扩展&#xff1f;为PHP提供一些扩展的功能常见的PHP扩展mysql-----提供给PHP操作MySQL数据库的功能gd2----动态创建图像xdebug-----跟踪、调试和分析PHP程序的运行状况查看PHP扩展1.使用phpinfo探针phpinfo()---输出关于PHP配置的信息输出PHP当前状态的大量信息&#…

php pdo 绕过,php-带PDO的忘记密码脚本(需要解密)

我可能有一个愚蠢的愚蠢的问题……我正在做一个被遗忘的密码脚本(当然是登录系统),但是我被卡住了.我创建了一个具有特殊ID的代码(有效,是的&#xff01;),但是我无法对其进行解密…您能帮我吗&#xff1f;这是我创建特殊ID的功能&#xff1a;Recovery_Script.phpinclude "…

php 图片系统,Linger

软件简介Linger 是 PHP 图片分享系统。一个精简的图片分享系统网站&#xff0c;采用Bootstrap前端框架&#xff0c;支持部分页面的移动端自适应。同时采用HTML5进行图片批量上传。使用了一个简单的时间线动态展示&#xff0c;可作为简易的图片社交社区。有一个完整的用户中心和…

php 传递类名,php 对象和数组序列化 serialize()返回字符串方便存储和传递 unserialize()反序列化 不丢失类型和结构...

现在开发中经常使用序列号和反序列化技术手段&#xff0c;php开发中也大量使用到。如下几个知名系统都使用了大量的序列化技术ecshop2. phpcms内容管理系统3.laravel框架一、序列号的目的&#xff1f;方便数组和对象的传输或存储&#xff0c;同时不丢失其类型和结构如下是ecsho…

基本的排序算法php,php四种基础排序算法

原标题&#xff1a;php四种基础排序算法曾经有网友问我关于面试题的问题&#xff0c;今天就发一个面试题笔试经常会出的排序算法&#xff0c;大家可以参考一下&#xff0c;如有问题可以给我留言。/*** php四种基础排序算法的运行时间比较* authors Jesse (jesse152163.com)* da…

php io流 读取wav,记php中的io流---帮助理解

//注意&#xff1a;当读到文件末尾的时候会返回-1.正常情况下是不会返回-1的。public static void main(String[] args) throws IOException {File fnew File("aaa.txt"); //定位文件位置InputStream innew FileInputStream(f); //创建字节输入流连接到文件byte[] bn…

php获取jsp的session的值,在JSP或Servlet中获取session数量

enumsul.getUserList();int i0;while(enums.hasMoreElements()){out.println(enums.nextElement());out.println(" ");if(i10){out.println("");}}out.println("当前在线的用户数&#xff1a;"i);out.println("退出登录");out.clos…