mysql show profile详解_SQL 性能分析利器 show profile

本文首发个人公众号《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。

相关阅读:

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

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

相关文章

php判断给定的整数是否是2的幂_C++_C语言判断一个数是否是2的幂次方或4的幂次方,快速判断一个数是否是2的幂次 - phpStudy...

C语言判断一个数是否是2的幂次方或4的幂次方快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方!将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0&…

python 包编译安装mysql_CentOS7编译安装MySQL8.0.23和Python3.1.9

卸载mariadbrpm -qa | grep mariadbmariadb-libs-5.5.64-1.el7.x86_64yum remove mariadb-libs.x86_64 -y安装高版本GCC,解决编译中会遇到的GCC 5.3 or newer is required (-dumpversion says 4.8.5)cd /optyum install centos-release-scl -yyum install devtoolse…

python3.0下载用什么浏览器_无法让Python下载网页源代码:“不支持浏览器版本”...

查看您列出的url,我执行了以下操作:使用wget下载了页面将urllib与ipython一起使用并下载了页面使用chrome,只保存了url所有3个都给了我相同的结果文件(相同的大小,相同的内容)。在这可能是因为我没有登录,但我确实看到…

java线程堆栈_深入JVM剖析Java的线程堆栈

在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因。在我看来线程堆栈分析技术是Java EE产品支持工程师所必须掌握的一门技术。在线程堆栈中存储的信息,通常远超出你的想象,我们可以在工作中善加利用这些信息。我的目标是…

java 文件下载方法_【工具类】Java后台上传下载文件的几种方式

/*** 将本地照片上传至腾讯云服务上*/public void uploadImage(String localImagePath) throws Exception {// 1.将订单照片上传至腾讯地图众包侧提供的云服务上try {File imageFile new File(localImagePath);if (imageFile.exists()) {String url "http://" map…

java io流读取txt文件_Java使用IO流读取TXT文件

通过BufferedReader读取TXT文件window系统默认的编码是GBK,而IDE的编码多数为UTF-8,如果没有规定new InputStreamReader(new FileInputStream(file),“GBK”)为GBK会出现读取内容乱码。//文件路径String filePath"C:/Users/Admin/Desktop/products.…

c 调用java程序_C ++可以调用Java代码吗?

小编典典是的,您当然可以。这是一个例子:这是java文件:public class InvocationHelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");System.out.println("Arguments sent to this pro…

java 大数类_Java大数类介绍

java能处理大数的类有两个高精度大整数BigInteger和高精度浮点数BigDecimal,这两个类位于java.math包内,要使用它们必须在类前面引用该包:importjava.math.BigInteger;和importjava.math.BigDecimal;或者importjava.math.*;以下从几个方面对B…

java 画树_java – 如何绘制代表连接节点图的树?

我想在Java GUI中显示树,但我不知道如何.树代表连接节点的图形,如下所示:我应该说我有自己的树类:public class BinaryTree{private BinaryNode root;public BinaryTree( ){root null;}public BinaryTree( Object rootItem ){root new BinaryNode( roo…

mysql 优化代码_MySQL Order by 语句优化代码详解

Order by语句是用来排序的,经常我们会使用到Order by来进行排序,下面我给大家来讲讲Order by用法与优化排序,有需要的同学可参考MySQL Order By keyword是用来给记录中的数据进行分类的。MySQL Order By Keyword根据关键词分类ORDER BY keywo…

java.lang.class_关于Java.lang.Class的一些疑问

User.class可以在编译时就确定下来Class的泛型,而new User().getClass()实际上是运行时才能确定下来实际是什么泛型。举个例子:public class User{}public class Student extends User{public static void main(String[] args) {User user1 new User();…

java文件 linux_Linux执行Java文件

最近学习shell脚本,写个简单java类让linux去执行java类没别的东西,就引了一个fastjson的jar,写了个main方法 序列化一个User对象 打印package com.lws.demo;import java.util.Date;import com.alibaba.fastjson.JSONObject;import com.lws.mo…

java 刽子手游戏_java基础(九):容器

集合的引入List (ArrayList LinkedList)Set (HashSet LinkedHashSet TreeSet )Map (HashMap LinkedHashMap TreeMap)CollectionsIterator使用泛型1.为什么使用集合而不是数组?集合和数组相似点都可以存储多个对象,对外作为一个整体存在数组的缺点长度必须…

java面试手写单链表_(转)面试大总结之一:Java搞定面试中的链表题目

packageLinkedListSummary;importjava.util.HashMap;importjava.util.Stack;/*** http://blog.csdn.net/luckyxiaoqiang/article/details/7393134 轻松搞定面试中的链表题目* http://www.cnblogs.com/jax/archive/2009/12/11/1621504.html 算法大全(1)单链表** 目录&#xff1a…

ccf认证俄罗斯方块java_CCF认证历年试题 - osc_h3robkrt的个人空间 - OSCHINA - 中文开源技术交流社区...

CCF认证历年试题不加索引整理会死星人orz第一题:CCF201712-1 最小差值(100分)CCF201703-1 分蛋糕(100分)CCF201612-1 中间数(100分)CCF201609-1 最大波动(100分)CCF201604-1 折点计数(100分)CCF201509-1 数列分段(100分)CCF201503-1 图像旋转(100分)CCF201412-1 门禁…

mysql 变量作表名查询_使用MySQL函数变量作为表名查询

我需要有一个表中增加一定的ID(如AUTO_INCREMENT)函数使用MySQL函数变量作为表名查询我有水木清华这样DELIMITER $$DROP FUNCTION IF EXISTS GetNextID$$CREATE FUNCTION GetNextID(tblName TEXT, increment INT)RETURNS INTDETERMINISTICBEGINDECLARE NextID INT;SELECT MAX(c…

java 签名 ecdsa_Java实现ECDSA签名算法

ECDSA签名算法package com.albedo.security;/*** DSA 加解密实现*/public class ECDSAUtils extends Base {//字符编码public static final String ALGORITHM "EC";public static final String SIGN_ALGORITHM "SHA1withECDSA";/*** ECDSA 验签** param …

java异常处理方式推荐做法_谈谈Java异常处理这件事儿

此文已由作者谢蕾授权网易云社区发布。欢迎访问网易云社区,了解更多网易技术产品运营经验。前言我们对于“异常处理”这个词并不陌生,众多框架和库在异常处理方面都提供了便利,但是对于何种处理才是最佳实践,也是众说纷纭。异常处…

as400和java的区别_文件传输协议和AS400

我目前收到以下错误:远程服务器返回错误:(501)参数或参数中的语法错误 .我已经检查了服务器并且文件确实存在,如果我打开命令提示符并键入以下代码它可以工作:ftpopen 192.168.1.2cd /Imagesget S12345.jpeg这是正常的&#xff0c…

java中同时两人提交数据_如何一起发送JSON请求和发布表单数据请求?

所以这是一个应该在POST请求中接受以下参数的API:token (as form data)apiKey (as form data){"notification": {"id": 1,"heading": "some heading","subheading": "some subheading","image&qu…