Show Profile官方文档地址:https://dev.mysql.com/doc/refman/5.7/en/show-profile.html

当我们在优化sql的时候可以使用explain来查看执行计划,可当根据执行计划优化完毕之后我们的sql的运行时间还是比较长,这时我们可以使用show profile

更细粒度的分析,show-profile,可以提高用来分析当前会话中语句执行的资源消耗情况,可以用于sql调优的测量.

1. 基本语法:

  • 查看是否开启:show variables like "%pro%";
  • 开启:set profiling = 1
  • 查看SQL执行时间:show profiles;
  • 查看记录中第一条SQL详细时间:show profile for query 1;
关于show Profile的基本用法请看上篇文章:通过Query Profiler查看MySQL语句运行时间

2. 通过type指定显示其他信息

我们看一下官方提供的profile语法:

SHOW PROFILE [type [, type] ... ][FOR QUERY n][LIMIT row_count [OFFSET offset]]type: {ALL                显示所有信息| BLOCK IO           显示块输入和输出操作的数量| CONTEXT SWITCHES   显示自愿上下文切换和非自愿上下文切换的数量| CPU                显示用户和系统的CPU使用时间| IPC                显示已发送和已接收消息(messages)的数量| MEMORY             -- 尚未生效| PAGE FAULTS        显示主要和次要页面错误的数量| SOURCE             显示源代码中函数名称以及该函数所在文件的名称和行号| SWAPS              显示SWAP数量
}

3. show profile返回的行和列

如下图所示,是执行一个show profile all for query 3;命令显示的结果集。我们根据行和列分别来分析一个每个字段的含义。

行字段的含义:
+---------------------+--------------+------+-----+----------+-------+
| Field               | Type         | Null | Key | Default  | Extra |
+---------------------+--------------+------+-----+----------+-------+
| QUERY_ID            | int(20)      | NO   |     | 0        |       | # 语句ID
| STATE               | varchar(30)  | NO   |     |          |       | # 状态
| DURATION            | decimal(9,6) | NO   |     | 0.000000 |       | # 持续时间,单位s
| CPU_USER            | decimal(9,6) | YES  |     | NULL     |       | # 用户态CPU时间,单位s
| CPU_SYSTEM          | decimal(9,6) | YES  |     | NULL     |       | # 系统态CPU时间,单位s
| 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     |       | # 源代码行数
+---------------------+--------------+------+-----+----------+-------+
列字段的含义:

* Sending data (最重要的一个过程★★★★★)线程正在读取和处理一条SELECT语句的行,并且将数据发送至客户端。由于在此期间会执行大量   的磁盘访问(读操作),这个状态在一个指定查询的生命周期中经常是耗时最长的。这个字段才是SQL真正运行采集+相应数据的时间,而非executing;--以下按照首字母顺序依次排序* After create这个状态当线程创建一个表(包括内部临时表)时,在这个建表功能结束时出现。即使某些错误导致建表失败,也会使用这个状态。* Analyzing当计算MyISAM表索引分布时。(比如进行ANALYZE TABLE时)* checking permissions这个线程检查服务器是否有具有执行该语句的所需权限。* Checking table线程正在执行表检查操作。* cleaning up线程处理一个命令,并正准备释放内存和重置某些状态变量。* closing tables线程正在将变更的表中的数据刷新到磁盘上并正在关闭使用过的表。这应该是一个快速的操作。如果不是这样的话则应该检查硬盘空间是否已满或者硬盘IO是否达到瓶颈。 * converting HEAP to MyISAM线程将一个内部临时表转换为磁盘上的MyISAM表。* copy to tmp table 线程正在处理一个ALTER TABLE语句。这个状态发生在新的表结构已经创建之后,但是在数据被复制进入之前。* Copying to group table如果一个语句有不同的ORDER BY和GROUP BY条件,数据会被复制到一个临时表中并且按组排序。* Copying to tmp table线程将数据写入内存中的临时表。  正在创建临时表以存放部分查询结果* Copying to tmp table on disk线程正在将数据写入磁盘中的临时表。临时表的结果集过大。所以线程将临时表由基于内存模式改为基于磁盘模式,以节省内存。但是这个过程会异常的缓慢!!* Creating index线程正在对一个MyISAM表执行ALTER TABLE ... ENABLE KEYS语句。* Creating sort index线程正在使用内部临时表处理一个SELECT 操作。* creating table线程正在创建一个表,包括创建临时表。* Creating tmp table线程正在创建一个临时表在内存或者磁盘上。如果这个表创建在内存上但是之后被转换到磁盘上,这个状态在运行Copying to tmp table on disk 的时候保持。* deleting from main table线程正在执行多表删除的第一部分,只从第一个表中删除。并且保存列和偏移量用来从其他(参考)表删除。* deleting from reference tables线程正在执行多表删除的第二部分,并从其他表中删除匹配的行。* discard_or_import_tablespace线程正在执行ALTER TABLE ... DISCARD TABLESPACE 或 ALTER TABLE ... IMPORT TABLESPACE语句。* end这个状态出现在结束时,但是在对ALTER TABLE, CREATE VIEW, DELETE, INSERT, SELECT,   或者 UPDATE 语句进行清理之前。* executing该线程已开始执行一条语句。* Execution of init_command线程正在执行处于init_command系统变量的值中的语句。* freeing items
* 线程已经执行了命令。在这个状态中涉及的查询缓存可以得到一些释放。这个状态通常后面跟随cleaning up状态。* Flushing tables线程正在执行FLUSH TABLES 并且等待所有线程关闭他们的表。* FULLTEXT initialization服务器正在准备进行自然语言全文检索。* init这个状态出现在线程初始化ALTER TABLE, DELETE, INSERT, SELECT, 或 UPDATE语句之前。服务器在这种状态下进行的操作,包括:刷新全日志、Innodb日志,和一些查询缓存清理操作。* Killed程序对线程发送了KILL语句,并且它应该放弃下一次对KILL标记的检查。这个标记在每一个MySQL的主要循环中被检查,但在某些情况下,它可能需要令线程在很短的时间内死亡。如果这个线程被其他线程锁住了,这个KILL操作会在其他线程释放锁的瞬时执行。* logging slow query这个线程正在将语句写入慢查询日志。* NULL没有操作的状态。* login线程连接的初始状态。直到客户端已经成功验证。* manage keys服务器启用或禁用表索引。* Opening tables, Opening table线程正试图打开一张表* optimizing服务器执行查询的初步优化。* preparing在查询优化过程中出现这个状态。* Purging old relay logs线程正在移除不必要的中继日志文件。* query end这个状态出现在处理一个查询之后,但是在freeing items状态之前。* Reading from net服务器正在从网络阅读数据包。* Removing duplicates查询正在使用SELECT DISTINCT,这种情况下MySQL不能在早期阶段优化掉一些distinct操作。因此,MySQL需要一个额外的阶段,在将结果发送到客户端之前删除所有重复的行。* removing tmp table线程正在移除一个内置临时表,在执行一条SELECT语句之后。 如果没有临时表产生,那么这个状态不被使用。* rename
* 线程正在重命名一张表。* rename result table线程正在处理ALTER TABLE语句,创建新的表,并且重命名它来代替原有的表。* Reopen tables线程获得了表锁,但是在取得表锁之后才发现该表的底层结构已经发生了变化。线程释放这个锁,关闭表,并试图重新打开该表。* Repair by sorting修复代码正在使用一个分类来创建索引。* Repair done线程完成一个多线程的MyISAM表的修复。* Repair with keycache修复代码正在通过索引缓存一个接一个地使用创建索引。这比通过分类修复要慢很多。* Rolling back线程正在回滚一个事务* Searching rows for update线程正在进行第一阶段,在更新前寻找所有匹配的行。如果update正在更改用于查找相关行的索引,则必须这么做。* setup线程正开始进行一个ALTER TABLE操作。* Sorting for group线程正在执行一个由GROUP BY指定的排序。* Sorting for order线程正在执行一个由ORDER BY指定的排序。* Sorting index线程正在对索引页进行排序,为了对MyISAM表进行操作时获得更优的性能。* Sorting result对于一个SELECT语句,这与创建排序索引相似,但是是对非临时表。* statistics服务器计算统计去规划一个查询。如果一个线程长时间处于这个状态,这个服务器的磁盘可能在执行其他工作。* System lock这个线程正在请求或者等待一个内部的或外部的系统表锁。如果这个状态是由于外部锁的请求产生的,并且你没有使用多个正在访问相同的表的mysql服务器* Waiting for table level lock系统锁定后的下一个线程状态。线程已获得外部锁并且将请求内部表锁。* Updating线程寻找更新匹配的行并进行更新。* updating main table线程正在执行多表更新的第一部分,只从第一个表中更新。并且保存列和偏移量用来从其他(参考)表更新。* updating reference tables线程正在执行多表更新的第二部分,并从其他表中更新匹配的行。* User lock线程正在请求或等待一个GET_LOCK()调用所要求的咨询锁。对于SHOW PROFILE,这个状态意味这线程正在请求锁。(而非等待)* User sleep线程调用了一个SLEEP()。* Waiting for commit lock一个显式或隐式语句在提交时等待释放读锁* Waiting for global read lock等待全局读锁。* Waiting for release of readlock等待释放读锁。* Waiting for tables, Waiting for table, Waiting for table flush线程获得一个通知,底层表结构已经发生变化,它需要重新打开表来获取新的结构。然而,重新打开表,它必须等到所有其他线程关闭这个有问题的表。这个通知产生通常因为另一个线程对问题表执行了FLUSH TABLES或者以下语句之一:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, or OPTIMIZE TABLE.* Waiting for lock_type lock等待各个种类的表锁。* Waiting on cond一个普通的状态,线程正在等待一个条件为真。没有特定的状态信息可用。* Writing to net服务器正在写一个网络数据包。

3. SQL执行过程中可能导致时间慢的原因


1. Sending data (最重要的一个过程★★★★★)线程正在读取和处理一条SELECT语句的行,并且将数据发送至客户端。由于在此期间会执行大量的磁盘访问(读操作),这个状态在一个指定查询的生命周期中经常是耗时最长的。对于一个普通查询来说,这个参数过大可分为两种情况1. 第一种是SQL本身,比如没有建立正确的索引,索引失效等等情况,这种数据体现在CPU_user 和CPU_sysyem字段 时间过长;2. 第二种是相应数据量过大,导致CPU调度时上下文频繁切换。这种数据体现在CONTEXT_INVOLUNTARY和CONTEXT_VOLUNTARY字段 时间过长;像:外网使用Navicat连接到远程数据库中。查询一个普通的SQL,在本地MySQL执行速度很快,但是使用远程服务器的MySQL就异常的缓慢。这时若查询profile详情,就会发现大量相应数据传输IO导致频繁的上下文切换消耗了大量的时间。2. converting HEAP to MyISAM原译指的是:线程将一个内部临时表转换为磁盘上的MyISAM表。我们实际操作中可能出现的问题就是查询结果太大了导致内存不够,往磁盘上搬。3.Creating tmp table创建了临时表4.Coping to tmp table on disk把内存中临时表复制到磁盘5.locked加锁------------------------------------------------ 2,4 可以修改一下tmp_table_size和max_heap_table_size两个参数来调整
show profile语句已经弃用,并将在以后版本中移除,建议使用 Performance Schema

Performance Schema文档:https://dev.mysql.com/doc/refman/5.7/en/performance-schema-query-profiling.html

MySQL中show profile详解相关推荐

  1. pdo mysql limit_PHP mysql中limit用法详解(代码示例)

    在MySQL中,LIMIT子句与SELECT语句一起使用,以限制结果集中的行数.LIMIT子句接受一个或两个offset和count的参数.这两个参数的值都可以是零或正整数. offset:用于指定要 ...

  2. MySQL中事物的详解

    1. 事物的定义及特性 事务是一组操作数据库的SQL语句组成的工作单元,该工作单元中所有操作要么同时成功,要么同时失败.事物有如下四个特性,ACID简称"酸性". 1)原子性:工作 ...

  3. Mysql中show命令详解

    MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中对show命令的使用还容易产生混淆,本文汇集了show命令的众多用法. a. show tables或show tables fr ...

  4. Mysql中的事务详解

    什么是事务 顾名思义,事务就是对一组事情的操作,要么把这件事办成了,要么这事儿就失败了:通俗来讲,事务就是一组sql语句的集合,要么这组sql全都执行成功,要么就全都执行失败:事务不是Mysql支持的 ...

  5. oracle的mvcc解析,PostgreSQL原理:Oracle 和 MySQL 中MVCC机制详解

    MVCC,Multi-version Concurrency Control ,顾名思义指的是多版本并发控制.在介绍MVCC之前我们先来简单了解下事务的隔离级别: read uncommitted:脏 ...

  6. MySQL中存储过程使用详解

    关联博文: 存储过程中的控制语句:http://blog.csdn.net/J080624/article/details/72353508 不同类型参数存储过程示例:http://blog.csdn ...

  7. MySQL中Explain用法详解

    Explain简介 我们在写后端程序的时候,通常会写sql来查询数据,如果是单表查询的时候,那直接select就完事了,但是如果是连表查询数据量也不小的话,就造成了查询速度会比较慢,那么我们该怎么知道 ...

  8. mysql中的tee_详解mysql的tee功能 并利用其记录相关操作

    由于经常对mysql数据库进行大量的更改操作,比如更改字段,添加或删除索引等等,我们把这些操作放到sql语句中,然后登陆mysql,通过source执行该sql文件,为了做好相关记录,方便以后的工作中 ...

  9. MySQL中if()函数详解

    一.if()函数介绍 在MySQL的官方文档中,将if()列为控制流功能之一,网上看了很多翻译,大家还是习惯上称为if()函数.根据官方文档,我们可以看出if()函数实现了if/else结构,大家可以 ...

  10. Mysql中的delimiter详解

    初学mysql时,可能不太明白delimiter的真正用途,delimiter在mysql很多地方出现,比如存储过程.触发器.函数等. 学过oracle的人,再来学mysql就会感到很奇怪,百思不得其 ...

最新文章

  1. jenkins+sonarqube流水线脚本模板
  2. 设置cookie和查找cookie的方法
  3. CVPR 2017 ECO:《ECO: Efficient Convolution Operators for Tracking》论文笔记
  4. python调用math函数_Python中sqrt函数使用方法
  5. 【Java语法】比较两个字符串是否相等
  6. xlwt写入单元格,xlrd读出单元格
  7. 无插件HTML,HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)分享!
  8. 【linux】设置镜像源
  9. 华为云新加坡峰会发布CloudAI创新实验室,四大核心优势助力智能化升级
  10. MD5,SHA-1,SHA-256摘要加解密
  11. 用 C# 实现带键值的优先队列
  12. keras+yolo实现旗帜识别
  13. 带着身体在香港肤浅行走(一)
  14. 数据结构与算法学习笔记
  15. 8类必须学会的运营工具
  16. ai条码插件免安装_AI条形码插件(含支持Illustrator cs6的条码脚本插件)
  17. 一个猫下面的计算机互相访问,光猫连接路由器和电脑如何互相访问
  18. rstudio安装后如何打开_Rstudio Server的安装和使用(附常见问题)
  19. Debussy VerilogVHDL ISE仿真平台搭建步骤
  20. 逆向之汇编(EBP寻址)

热门文章

  1. 目标检测模型的评价标准-AP与mAP
  2. 公有云、私有云、混合云
  3. 云南农职《JavaScript交互式网页设计》 综合机试试卷④——蔚蓝网导航栏
  4. 「镁客·请讲」艾拉比芮亚楠:当OTA普及,我们将在物联网和车联网看到三个变化...
  5. 浅谈“异常信息泄露(应用程序错误)”
  6. Oracle9i数据库Data Guard实施及维护手册
  7. 近年来的Java面试题汇总。帮你圆大厂梦。
  8. Android 出海 Admob 踩坑
  9. angularjs checkbox 框的操作
  10. 六,文件操作(编码,读写文件,with方法)