分析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

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

  1. mysql 执行效率命令_MySQL优化--explain 分析sql语句执行效率

    MySQL优化--explain 分析sql语句执行效率 explain 命令 explain 命令在解决数据库性能上市第一推荐使用命令,大部分的性能问题可以通过此命令来简单解决,explain可以用 ...

  2. mysql存储过参数拼接_mysql 存储过程动态拼接sql并执行赋值

    CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`(in _xnb varchar(50)) BEGIN ## 定义变量 DECLARE _num FL ...

  3. mysql 登录的权限设置_MySQL 登录权限设置SQL语句

    MySQL 登录权限设置SQL语句 1. 创建hive用户 create user 'hive'@'master' identified by 'hive'; 2. 对hive用户赋予权限 grant ...

  4. mysql sql执行过程_MySQL探秘(二):SQL语句执行过程详解

    昔日庖丁解牛,未见全牛,所赖者是其对牛内部骨架结构的了解,对于MySQL亦是如此,只有更加全面地了解SQL语句执行的每个过程,才能更好的进行SQL的设计和优化. 当希望MySQL能够以更高的性能运行查 ...

  5. hql取满足条件最新一条记录_MySql 之一条查询sql的执行过程

    每当我把一条查询sql语句写完了,并且执行完得到想要的结果.这时我就在想为什么我写这样的一条sql语句,就能给我查询出我想要的结果,为什么我写了update就能更新一条语句?它们的执行过程是什么样的? ...

  6. explain ref_数据库查询优化:使用explain分析sql语句执行效率

    对于复杂.效率低的sql语句,我们通常是使用explain sql 来分析sql语句,这个语句可以打印出,语句的执行过程.这样方便我们分析,进行优化. 首先,说一下,explain查询出来的数据如何分 ...

  7. 【转】2.1【MySQL】运行原理(一):查询sql的执行过程及MySQL架构分析

    MySQL的发展历史和版本分支: 时间 里程碑 1996 年 MySQL1.0 发布.它的历史可以追溯到 1979 年,作者 Monty 用 BASIC 设计的一个报表工具. 1996 年 10 月 ...

  8. 史上最简单MySQL教程详解(基础篇)之SQL语句以及预留关键字介绍

    SQL简单介绍 数据操作语句 (Data Manipulation Language,DML) 数据定义语句 (Data Definition Language ,DDL) 数据控制语句 (Data ...

  9. mysql分析sql语句基础工具 —— explain

    转载自 https://segmentfault.com/a/1190000009724144 立即登录 [笔记] mysql分析sql语句基础工具 -- explain  mysql wateran ...

最新文章

  1. java word模板占位符_word模板导出的几种方式:第一种:占位符替换模板导出(只适用于word中含有表格形式的)...
  2. Freemarker入门小案例(生成静态网页的其中一种方式)
  3. lnmp环境脚本自动配置
  4. 互联网推送服务原理:长连接+心跳机制(MQTT协议)
  5. 根据年月打印出该月有多少天
  6. 计算机应用课程的考核情况,《计算机应用技术》课程kpi考核说明..doc
  7. python爬淘宝评论源代码_python3爬取淘宝信息代码分析
  8. c 易语言置入代码6,易语言置入代码 , 谁碰到这种情况_精易论坛
  9. 使用手持式频谱分析仪进行TDD信号分析
  10. Hadoop的容错性
  11. Axure软件页面介绍
  12. 无法启动 因为计算机丢失msvcp71,Win7丢失msvcp71.dll文件程序无法启动怎么办?
  13. linux_5.10 iptables踩坑
  14. 模拟夜间灯光-科目三-灯光口令(9选5)
  15. HTML——多媒体语义化标签
  16. win10启动项在什么地方
  17. win10下载python失败_win10环境下python下载安装,及一些错误的解决方案
  18. 前端工具之Vue-Generator
  19. Java代码的三板斧
  20. CPU系统级验证——验证环境——OpenHW core-v验证环境及文件分析

热门文章

  1. MaxCompute - ODPS重装上阵 第一弹 - 善用MaxCompute编译器的错误和警告
  2. 一切转型始于数据和模型 | 2020 MATLAB EXPO 中国线上用户大会:即将上线
  3. 肯耐珂萨助力世界500强零售企业在线春招:单次面试3000人
  4. 架构日趋复杂的今天,如何重构数据库和应用边界?
  5. html5 烟雾,jQuery烟雾背景发生器(HTML5 Canvas插件waterpipe.js
  6. pyside2 镜像安装_pyside2 镜像安装_【PySide2学习笔记】0_下载安装
  7. css h5移动端背景铺满
  8. bash: jps: command not found
  9. layui Form内容重置清空
  10. Springboot/Cloud集成Sentinel进阶实战