本文首发个人公众号《andyqian》, 期待你的关注~

前言

在之前的文章中,我们提到过一些慢SQL优化的步骤。其中就包括:使用 explain 关键字来查看执行计划,是否命中索引。

通过计算某列的区分度,来判断该列是否适合新建索引。

这都是一些比较好的方法。但我们还是不知道,慢SQL,到底慢在哪个环节?在每个环节中耗时是多少?

根据木桶定理,我们应该找到耗时最长,性能最低,也就是最慢的环节,才能分析出慢SQL为什么这么慢,以便更加有效的解决这个问题。带着这个疑问,我们一起来看看今天给大家介绍的这个利器。

开启性能分析

show profiles 这个命令非常强大,能清晰的展示每条SQL的持续时间。通常结合show profile 命令可以更加详细的展示其耗时信息。这样就能很容易的分析出,到底慢在哪个环节了。比较遗憾的是,在MySQL中,该命令默认是关闭状态的。在使用之前,我们首先得启用它:开启命令:

set profiling = ON;

或:

set profiling = 1;

查看是否生效:

mysql> show variables like "profiling";

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

| Variable_name | Value |

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

| profiling | ON |

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

1 row in set (0.00 sec)

Value的取值范围有两个:其中 ON 为开启状态,OFF为关闭状态。

值得注意的是:通过上述命令开启后仅在当前会话有效。

show profiles

show profiles 其作用为显示当前会话服务器最新收到的15条SQL的性能信息。

其中包括:持续时间,以及Query_ID。我们可以通过Query_ID分析其性能

如下所示:

mysql> show profiles;

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

| Query_ID | Duration | Query |

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

| 1 | 0.00385450 | show variables like "profiling" |

| 2 | 0.00170050 | show variables like "profiling" |

| 3 | 0.00038025 | select * from t_base_user |

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

其中:Query_ID 表示执行SQL的唯一标识。

Duration 表示持续时间,默认单位为秒。

Query 就是我们所执行的SQL语句。

注意:show profiles 语句 默认显示的是服务端接收到的最新的15条语句。

我们可以通过以下语句进行修改默认值:

set profiling_history_size =20;

profiling_history_size最大取值取值范围为[0,100]。

当超过100时,则会设置自动设置为最大值100。

当小于0时,则会自动设置最小值为0。

当其等于0时,其效果等同于 set profiling=0,关闭性能分析模式。

现在通过 show profiles 命令查看到了SQL的执行时间,但这是一个总时间,每一步的耗时怎么看呢?别急,我们再来看看show profile 命令的用法。

show profile

还记得show profiles命令中的 Query_ID字段吗?我们现在就通过Query_ID来查看下持续时间的构成。

例如:我们查看Query_ID 等于 3 的详细持续时间构成。

如下所示:

mysql> show profile for query 3;

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

| Status | Duration |

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

| starting | 0.000081 |

| checking permissions | 0.000012 |

| Opening tables | 0.000028 |

| init | 0.000029 |

| System lock | 0.000017 |

| optimizing | 0.000006 |

| statistics | 0.000025 |

| preparing | 0.000018 |

| executing | 0.000004 |

| Sending data | 0.000087 |

| end | 0.000007 |

| query end | 0.000012 |

| closing tables | 0.000013 |

| freeing items | 0.000023 |

| cleaning up | 0.000021 |

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

15 rows in set, 1 warning (0.00 sec)

通过上述结果,我们可以非常清楚的查看每一步的耗时,其中(Druation的单位为秒)。这样,当我们遇到一条慢SQL时,就能很清楚的知道,为什么慢,慢在哪一步了。

备注: 上述结果集中的Status就不再详细解析了,这里其实展示的是SQL的执行过程,经历的步骤,通过字面就能很快知道其意思。

上面我们使用的是默认展示结果。其实,我们也指定展示结果,如:CPU,IO,线程上下文切换等等。

可选参数如下:all: 展示所有信息。

block io: 展示io的输入输出信息。

context switches: 展示线程的上线文切换信息。

cpu :显示SQL 占用的CPU信息。

ipc: 显示统计消息的发送与接收计数信息。

page faults:显示主要与次要的页面错误。

memory:本意是显示内存信息,但目前还未实现。

swaps: 显示交换次数。

sources:显示源代码中的函数名称,以及函数发生的文件的名称和行。

上面参数可以组合使用,其中用 , 号分割。如下所示:

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

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

| Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |

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

| starting | 0.000081 | 0.000036 | 0.000044 | 0 | 0 |

| checking permissions | 0.000012 | 0.000005 | 0.000006 | 0 | 0 |

| Opening tables | 0.000028 | 0.000013 | 0.000015 | 0 | 0 |

| init | 0.000029 | 0.000013 | 0.000016 | 0 | 0 |

| System lock | 0.000017 | 0.000008 | 0.000009 | 0 | 0 |

| optimizing | 0.000006 | 0.000002 | 0.000003 | 0 | 0 |

| statistics | 0.000025 | 0.000011 | 0.000013 | 0 | 0 |

| preparing | 0.000018 | 0.000008 | 0.000010 | 0 | 0 |

| executing | 0.000004 | 0.000002 | 0.000002 | 0 | 0 |

| Sending data | 0.000087 | 0.000040 | 0.000048 | 0 | 0 |

| end | 0.000007 | 0.000003 | 0.000003 | 0 | 0 |

| query end | 0.000012 | 0.000006 | 0.000007 | 0 | 0 |

| closing tables | 0.000013 | 0.000005 | 0.000006 | 0 | 0 |

| freeing items | 0.000023 | 0.000011 | 0.000013 | 0 | 0 |

| cleaning up | 0.000021 | 0.000009 | 0.000011 | 0 | 0 |

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

15 rows in set, 1 warning (0.00 sec)

当结果显示的比较多时,你也可以通过 limit 选项,来显示指定的行数。如下所示:

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

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

| Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |

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

| starting | 0.000081 | 0.000036 | 0.000044 | 0 | 0 |

| checking permissions | 0.000012 | 0.000005 | 0.000006 | 0 | 0 |

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

2 rows in set, 1 warning (0.00 sec)

现在我们就可以很清楚的知道,慢SQL到底慢在哪?可以进行针对性的优化。我们对优化后的SQL语句也能查看其持续时间,是否符合我们的指标。

PS: 最近在面试过程中,问及SQL优化时,有很多的同学对执行计划,区分度的概念都不是很清楚。甚至觉得执行计划中有执行时间,这就很离谱了,对不对。我希望我的读者朋友们不要被这种低级错误挡住理想的offer。

相关阅读:

mysql show profile详解_SQL 性能分析利器 show profile相关推荐

  1. Mysql进阶优化篇01——四万字详解数据库性能分析工具(深入、全面、详细,收藏备用)

    前 言 ?? 作者简介:,长跑型选手,立志坚持写10年博客,专注于java后端 ?? 专栏简介:mysql进阶,主要讲解mysql数据库进阶知识,包括索引.数据库调优.分库分表等 ?? 文章简介:本文 ...

  2. UIWebView、WKWebView使用详解及性能分析

    一.整体介绍 UIWebView自iOS2就有,WKWebView从iOS8才有,毫无疑问WKWebView将逐步取代笨重的UIWebView.通过简单的测试即可发现UIWebView占用过多内存,且 ...

  3. MYSQL的sqlca详解_sql数据库如何使用

    关于 sql数据库如何使用的搜索结果 问题 最佳实践 -SQL Server -使用SSMS和BCP迁移SQL Server数据库 本文以本地SQL Server数据库到阿里云云数据库SQL Serv ...

  4. Redis批量操作详解及性能分析

    通过mget批量执行指令可以节约网络连接和数据传输开销,在高并发场景下可以节约大量系统资源.本文中,我们更进一步,比较一下redis提供的几种批量执行指令的性能. 1. 为什么需要批量执行redis指 ...

  5. NSLog使用详解与性能分析

    NSLog 使用 在XCode做开发调试时往往需要打印一些调试信息做debug用 NSLog 性能问题 它的运行会占用时间和设备资源.当打印信息的地方多了之后在模拟器上跑可能不会有什么问题,因为模拟器 ...

  6. vmstat命令详解——linux性能分析

    版本信息: procps version 3.2.8 基本使用: vmstat [-a] [-n] [-t] [-S unit] [delay [ count]] [-a]:显示活跃和非活跃内存 [- ...

  7. JAVA中Explain注解用法,mysql之explain详解(分析索引最佳使用)

    mysql之explain详解(分析索引最佳使用) mysql explain用于分析sql 语句的执行及数据库索引的使用.本文将致力于帮助大家充分理解explain所返回的各项参数,从而使大家快速掌 ...

  8. mysql之explain详解(分析索引最佳使用)

    mysql之explain详解(分析索引最佳使用) mysql explain用于分析sql 语句的执行及数据库索引的使用.本文将致力于帮助大家充分理解explain所返回的各项参数,从而使大家快速掌 ...

  9. MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测) 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过 ...

最新文章

  1. java 问题排查_JAVA问题排查笔记
  2. 个人随笔-《江城子·驻西航》
  3. 汇顶软件开发初面总结20180921
  4. magic square java_测试Magic Square Java的.txt文件
  5. 计算机中的字,双字以及存储
  6. .net里面实现javascript中的 escape 和 unescape 功能
  7. http 访问mysql数据库_04.Http协议之GET请求与访问MySQL数据库
  8. Python网络框架——Web服务器
  9. 比特币 以太坊 真的是去中心化的吗?
  10. c++删除字符串特殊符号
  11. java PDF添加水印效果
  12. 超声波传感器测距实验430
  13. 华为网络设备查看风扇状态命令
  14. 一个周末掌握IT前沿技术之node.js篇一:Node.js与javascript
  15. oracle没commit有日志吗,commit操作是否一定会被记录到redo等问题的研究
  16. 7个H5网页制作工具全面介绍
  17. seaborn中sns.distplot图例显示方法及无法显示的解决办法
  18. C# FTP操作(上传、下载等……)
  19. 关于运行opendaylight时client: JAVA_HOME not set; results may vary
  20. 我很喜欢研究这些比较酷的效果

热门文章

  1. vue解决字符串模板@click无效的问题
  2. java spring注解维护,从一次工程启动失败谈谈 spring 注解
  3. qtcreator下拉列表怎么制作_设置EXCEL动态下拉菜单,只需要一个组合键,新手也能快速掌握...
  4. 主板没有rgb接口怎么接灯_纯白信仰打造RGB主机,四件套提升100%性能-Thermaltake...
  5. java责任链模式审批请假_Java使用责任链模式处理学生请假问题详解
  6. js(javascript)之浏览器控制台使用
  7. 周围剃光头顶留长发型_发型改变气质,这话放在石原里美身上也通用啊
  8. flink 不设置水印_从0到1学习Flink—— Flink parallelism 和 Slot 介绍
  9. Python工程笔记(1):轨迹与日志
  10. 如何更新mysql数据库字段_如何使用MySQL一个表中的字段更新另一个表中字段