首页 > 数据库 >mysql查看耗费时间

mysql查看耗费时间

时间:2023-05-07 16:04:10浏览次数:51  
标签:profiling 查看 show mysql set SQL Query 耗费

开启性能分析

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

  1. 开启命令:
    set profiling = ON;
    或:
    set profiling = 1;
  2. 查看是否生效:
    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       |
+----------+------------+---------------------------------+

其中:

  1. Query_ID 表示执行SQL的唯一标识。
  2. Duration 表示持续时间,默认单位为秒。
  3. Query 就是我们所执行的SQL语句。

注意:

  1. show profiles 语句 默认显示的是服务端接收到的最新的15条语句。
    我们可以通过以下语句进行修改默认值:
    set profiling_history_size =20;
    profiling_history_size最大取值取值范围为[0,100]。
  2. 当超过100时,则会设置自动设置为最大值100。
  3. 当小于0时,则会自动设置最小值为0。
  4. 当其等于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,线程上下文切换等等。
可选参数如下:

  1. all: 展示所有信息。
  2. block io: 展示io的输入输出信息。
  3. context switches: 展示线程的上线文切换信息。
  4. cpu :显示SQL 占用的CPU信息。
  5. ipc: 显示统计消息的发送与接收计数信息。
  6. page faults:显示主要与次要的页面错误。
  7. memory:本意是显示内存信息,但目前还未实现。
  8. swaps: 显示交换次数。
  9. 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。

转自:SQL 性能分析利器 show profile - 知乎 (zhihu.com)

标签:profiling,查看,show,mysql,set,SQL,Query,耗费
From: https://www.cnblogs.com/caoaman/p/17379415.html

相关文章

  • 学习笔记:MySQL常用的一些SQL语句
    本文谈谈MySQL的开发必会的sql语句创建数据库createdatabasedb1;删除数据库dropdatabasedb1;创建数据表createtabletb1用户表(idintnotnullauto_increment primarykey,namechar(10),                     department_idint,            ......
  • mysql执行顺序
    Mysql语法顺序,即当sql中存在下面的关键字时,它们要保持这样的顺序: select[distinct]fromjoin(如leftjoin)onwheregroupbyhavingunionorderbylimit  Mysql执行顺序,即在执行时sql按照下面的顺序进行执行: from......
  • [docker]mysql的docker镜像中docker-entrypoint-initdb.d目录的妙用
    docker-entrypoint-initdb.d是Docker官方MySQL镜像中的一个目录,用于初始化数据库。在该目录下,可以放置一些SQL脚本文件,MySQL会在容器启动时自动执行这些脚本文件,用于创建用户、创建数据库、创建表等操作。具体来说,当MySQL镜像启动时,其entrypoint.sh脚本会检查是否存在......
  • 在本机有MYSQL57的情况下安装MYSQL80
    下载MYSQL80https://dev.mysql.com/downloads/mysql/需要ORACLE账号配置环境变量加一个环境变量MYSQL_HOME80值为自己的放置解压的MYSQL80的根目录路径在PATH中配置环境变量%KEY%可以索引到刚才在外面配置的路径的内容,然后加上\bin,\bin中有可执行的批处理脚本将80的环境......
  • Linux deplay 安装 Ubuntu 及 MySQL
    设备支持:已root的mi-4(架构:armv71)软件支持:LinuxDeplay在Linuxdeplay上安装好你希望安装的Linux版本,我这里安装的是Ubuntu18.04(bionic),注意要根据手机的处理器型号选择适配的处理器版本,由于mi-4的处理器是armv71,发行版本选择armhfARMCortex-A系列(A53、A57、......
  • MySQL数据优化
    select*fromstudent;deletefromstudent;SELECTCOUNT(1)fromstudent;SELECT*FROM`student`LIMIT10000,10--0.674s--0.033s--0.031sSELECT*FROM`student`LIMIT10000,10;--0.031sSELECT*FROM`student`LIMIT10000,100;--0.032sSELECT*FROM......
  • mysql error 1064(42000)
    mysql表里面,使用同样的语法查询一张表,用的nopcommerce的表,里面的Order表,查询的时候出不来,总是提示1064(42000说语法有错误,思考不会有错,于是查询这个问题,也有想过这张表名有些特殊, 查询要加反单引号,select*from`Order`;就查询出来了,可能Order是一个关键......
  • MySQL调优 - 汇总
    汇总下平时开发中对mysql的调优过程。(一)mysqlserver的调优首先需要知道哪些配置可以调整,通过showvariables可以查看配置项。可以通过set方式更改配置项:方式一:(例子)set long_query_time=1;但仅对当前session生效,新连接更改无作用,如下方式二:(例子)setgloballong_query_t......
  • Linux下七种文件类型、文件属性及其查看方法
    1、七种文件类型普通文件类型Linux中最多的一种文件类型,包括纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);各种压缩文件.第一个属性为[-]目录文件就是目录,能用#cd命令进入的。第一个属性为[d],例如[drwxrwxrwx]块设备文件块设备文件:就是存储数据以......
  • 查看linux主机硬件配置:cpu /内存/显卡/磁盘
    CPU总览lscpu查看物理CPU个数cat/proc/cpuinfo|grep"physicalid"|sort|uniq|wc-l查看每个物理CPU中core的个数(即核数)cat/proc/cpuinfo|grep"cpucores"|uniq查看逻辑CPU的个数cat/proc/cpuinfo|grep"processor"|wc-l查看线程数grep'......