mysql show profiles 性能跟踪诊断工具

举报
IT 叶新东老师 发表于 2021/12/21 23:41:55 2021/12/21
【摘要】 前言 Show profiles最大的好处是可以查看执行sql语句时各个环节的执行时间, Show profiles是5.0.37之后添加的,要想使用此功能,要确保版本在5.0.37之后。 可以执行s...

前言

Show profiles最大的好处是可以查看执行sql语句时各个环节的执行时间,
Show profiles是5.0.37之后添加的,要想使用此功能,要确保版本在5.0.37之后。

可以执行sqlselect version();查看当前数据库版本。

开启 profiling

启动数据库后,profiles默认是关闭的,并且开启后只存在当前会话,因为它是保存在内存中的,不会持久化存储,重新登录或者重启后就会重置;可通过下面的语句开启

-- 以下2条语句选其一即可
set profiling = 1;

set profiling=on;

  
 
  • 1
  • 2
  • 3
  • 4

通过下面的语句查看profiles的启动状态,Value值为ON 表示是开启的

-- 这2条语句选其一即可
show variables like 'profiling';

select @@profiling;

  
 
  • 1
  • 2
  • 3
  • 4

show profiles 查看sql执行所需时间

接下来我们查询一条sql,

mysql> select * from student limit 1;
+-----+--------+------+
| id  | name   | age  |
+-----+--------+------+
| 145 | 王五   |   30 |
+-----+--------+------+
1 row in set (0.00 sec)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

然后在输入show profiles;,就会显示刚刚查询的sql执行了多长时间,其中(Druation的单位为秒)

mysql> show profiles;
+----------+------------+---------------------------------+
| Query_ID | Duration   | Query                           |
+----------+------------+---------------------------------+
|        7 | 0.00023875 | select * from student limit 1   |
+----------+------------+----------------------------------

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

我们看到结果中有个Query_ID,输入 命令show profile for query 7;,则可以看到更加详细的时间,我们可以非常清楚的查看每一步的耗时,其中Druation的单位为秒)。这样,当我们遇到一条慢SQL时,就能很清楚的知道,为什么慢,慢在哪一步了。

mysql> show profile for query 7;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000062 |
| checking permissions | 0.000007 |
| Opening tables       | 0.000023 |
| init                 | 0.000021 |
| System lock          | 0.000008 |
| optimizing           | 0.000005 |
| statistics           | 0.000014 |
| preparing            | 0.000012 |
| executing            | 0.000003 |
| Sending data         | 0.000044 |
| end                  | 0.000004 |
| query end            | 0.000007 |
| closing tables       | 0.000008 |
| freeing items        | 0.000010 |
| cleaning up          | 0.000012 |
+----------------------+----------+
15 rows in set, 1 warning (0.00 sec)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

那么这些status都代表什么意思呢?我们选择几个比较重要的项说明一下

  • starting

lex+yacc 语法语义解析,得到解析树

  • checking permissions

检查权限,但是在某些SQL语句下,状态为checking permission时,并不一定真的在做权限检查。

所以不要频繁的向数据库发送show full tables from test like ‘%demo%’,尤其是在表的数量很多时。

  • Opening tables

打开表做好table cache,做好和innodb表物理文件的关联,同时加MDL LOCK 主要函数open_tables

  • System lock

主要函数handler::ha_external_lock,之前会实现myisam等引擎的mysql层表锁,innodb做共享表锁。

  • Sending data

“Sending data”并不是单纯的发送数据,而是包括“收集 + 发送 数据”。这里是收集是从磁盘收集数据;

show warnings 查看警告信息

持此之外我们还看到最后一行有有一个警告

15 rows in set, 1 warning (0.00 sec)

  
 
  • 1

接下来我们可以通过# show warnings命令看看这个警告是什么


mysql> show warnings;
+---------+------+-------------------------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                                     |
+---------+------+-------------------------------------------------------------------------------------------------------------+
| Warning | 1287 | 'SHOW PROFILE' is deprecated and will be removed in a future release. Please use Performance Schema instead |
+---------+------+-------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这个警告是告诉你“SHOW PROFILE”已弃用,将在将来的版本中删除。请改用性能模式;虽然说会被弃用,但是在低版本中,这个命令还是会被经常用到。

其他用法

除此之外,show profile [type] 还有一个type属性,可以指定 可选值以显示特定的附加信息类型:

  1. ALL: 显示所有信息
  2. BLOCK IO: 显示块输入和输出操作的计数
  3. CONTEXT SWITCHES :显示自愿和非自愿上下文切换的计数
  4. CPU :显示用户和系统 CPU 使用时间
  5. IPC :显示发送和接收消息的计数
  6. MEMORY :目前未实施
  7. PAGE FAULTS :显示主要和次要页面错误的计数
  8. SOURCE :显示源代码中函数的名称,以及函数所在文件的名称和行号
  9. SWAPS: 显示交换计数

文章来源: yexindong.blog.csdn.net,作者:java叶新东老师,版权归原作者所有,如需转载,请联系作者。

原文链接:yexindong.blog.csdn.net/article/details/119453380

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。