脚本之家

电脑版
提示:原网页已由神马搜索转码, 内容由www.jb51.net提供.
您的位置:首页数据库Mysql→ MySQL PROFILING查看SQL执行

MySQL中使用PROFILING来查看SQL执行流程的实现步骤

  更新时间:2024年07月04日 10:45:31  作者:zxrhhm 
在MySQL中,PROFILING功能提供了一种方式来分析SQL语句的执行时间,包括查询执行的各个阶段,如发送、解析、优化、执行等,这对于诊断性能问题非常有用,本文给大家介绍了MySQL中使用PROFILING来查看SQL执行流程的实现步骤,需要的朋友可以参考下

引言

在MySQL中,PROFILING功能提供了一种方式来分析SQL语句的执行时间,包括查询执行的各个阶段,如发送、解析、优化、执行等。这对于诊断性能问题非常有用。然而,需要注意的是,从MySQL 5.7.7版本开始,PROFILING功能被标记为已弃用(deprecated),并在以后的版本中完全移除。

使用PROFILING来查看SQL执行流程。以下是如何开启和使用PROFILING的步骤

1、开启Profiling

1.1、本次测试的环境

(root@localhost)[superdb]> status
--------------
mysql Ver 8.4.0 for Linux on x86_64 (MySQL Community Server - GPL)
Connection id: 11
Current database: superdb
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 8.4.0 MySQL Community Server - GPL
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
UNIX socket: /tmp/mysql.sock
Binary data as: Hexadecimal
Uptime: 22 hours 13 min 49 sec
Threads: 2 Questions: 46 Slow queries: 0 Opens: 182 Flush tables: 3 Open tables: 101 Queries per second avg: 0.000
--------------

1.2、开启Profiling

(root@localhost)[superdb]> show variables like 'profiling';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| profiling | OFF |
+---------------+-------+
1 row in set (0.01 sec)
(root@localhost)[superdb]> SET profiling =1;
Query OK, 0 rows affected, 1 warning (0.00 sec)
-- OR
SET profiling = on;
(root@localhost)[superdb]> show variables like 'profiling';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| profiling | ON |
+---------------+-------+
1 row in set (0.00 sec)

2、执行SQL查询

执行要分析的SQL查询。

(root@localhost)[superdb]> select * from dept;
+--------+------------+----------+
| deptno | dname | loc |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
4 rows in set (0.00 sec)

3、查看查询的Profile

执行查询后,你可以通过以下命令查看所有查询的Profile

(root@localhost)[superdb]> show profiles;
+----------+------------+---------------------------------+
| Query_ID | Duration | Query |
+----------+------------+---------------------------------+
| 1 | 0.00288125 | show variables like '%profile%' |
| 2 | 0.00334150 | show variables like 'profiling' |
| 3 | 0.00147475 | select * from dept |
| 4 | 0.00265825 | show variables like 'profiling' |
| 5 | 0.00125125 | select * from dept |
+----------+------------+---------------------------------+
5 rows in set, 1 warning (0.00 sec)

这将列出所有已执行的查询及其查询编号(Query_ID)。

4、查看特定查询的详细Profile

选择你想要查看详细Profile的查询编号,然后使用以下命令:

(root@localhost)[superdb]> show profile for query 5;
+--------------------------------+----------+
| Status | Duration |
+--------------------------------+----------+
| starting | 0.000092 |
| Executing hook on transaction | 0.000028 |
| starting | 0.000032 |
| checking permissions | 0.000030 |
| Opening tables | 0.000257 |
| init | 0.000032 |
| System lock | 0.000071 |
| optimizing | 0.000028 |
| statistics | 0.000037 |
| preparing | 0.000037 |
| executing | 0.000096 |
| end | 0.000028 |
| query end | 0.000043 |
| waiting for handler commit | 0.000268 |
| closing tables | 0.000034 |
| freeing items | 0.000090 |
| cleaning up | 0.000050 |
+--------------------------------+----------+
17 rows in set, 1 warning (0.00 sec)

或者,你可以查看该查询的特定方面,如CPU_TIME、CONTEXT_SWITCHES等:

(root@localhost)[superdb]> SHOW PROFILE CPU, BLOCK IO FOR QUERY 5;
+--------------------------------+----------+----------+------------+--------------+---------------+
| Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |
+--------------------------------+----------+----------+------------+--------------+---------------+
| starting | 0.000092 | 0.000067 | 0.000025 | 0 | 0 |
| Executing hook on transaction | 0.000028 | 0.000020 | 0.000008 | 0 | 0 |
| starting | 0.000032 | 0.000023 | 0.000009 | 0 | 0 |
| checking permissions | 0.000030 | 0.000021 | 0.000008 | 0 | 0 |
| Opening tables | 0.000257 | 0.000126 | 0.000047 | 0 | 0 |
| init | 0.000032 | 0.000023 | 0.000009 | 0 | 0 |
| System lock | 0.000071 | 0.000051 | 0.000019 | 0 | 0 |
| optimizing | 0.000028 | 0.000020 | 0.000008 | 0 | 0 |
| statistics | 0.000037 | 0.000027 | 0.000010 | 0 | 0 |
| preparing | 0.000037 | 0.000027 | 0.000010 | 0 | 0 |
| executing | 0.000096 | 0.000070 | 0.000026 | 0 | 0 |
| end | 0.000028 | 0.000023 | 0.000009 | 0 | 0 |
| query end | 0.000043 | 0.000030 | 0.000012 | 0 | 0 |
| waiting for handler commit | 0.000268 | 0.000000 | 0.000148 | 0 | 0 |
| closing tables | 0.000034 | 0.000000 | 0.000034 | 0 | 0 |
| freeing items | 0.000090 | 0.000000 | 0.000090 | 0 | 0 |
| cleaning up | 0.000050 | 0.000000 | 0.000049 | 0 | 0 |
+--------------------------------+----------+----------+------------+--------------+---------------+
17 rows in set, 1 warning (0.00 sec)

5、总结

由于PROFILING在MySQL 5.7.7之后被弃用,并在未来MySQL的版本中完全移除,你需要使用其他工具或方法来进行性能分析。

  • Performance Schema:MySQL 5.5及更高版本引入了Performance Schema,这是一个功能强大的性能监控和诊断框架。你可以使用它来收集关于服务器执行情况的详细数据。

  • EXPLAIN和EXPLAIN ANALYZE:EXPLAIN语句可以用来查看MySQL如何执行SELECT语句,包括如何连接表和选择索引。MySQL 8.0.18引入了EXPLAIN ANALYZE,它提供了查询执行计划的详细运行时统计信息。

  • 慢查询日志:通过配置MySQL的慢查询日志,你可以捕获执行时间超过指定阈值的所有查询。这对于识别性能瓶颈非常有用。

  • 第三方工具:如Percona Toolkit、MySQL Workbench等,这些工具提供了图形界面和额外的功能来帮助你分析和优化MySQL查询。

总的来说,虽然PROFILING是一个有用的工具,但随着MySQL的发展,你应该考虑使用更现代和强大的性能分析工具。

以上就是MySQL中使用PROFILING来查看SQL执行流程的实现步骤的详细内容,更多关于MySQL PROFILING查看SQL执行的资料请关注脚本之家其它相关文章!

相关文章

    • 这篇文章主要介绍了mysql数据库的加密与解密方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
      2024-01-01
    • 在MySQL中,行转列和列转行都是非常有用的操作,本文就来介绍一下Mysql行与列的多种转换,主要包括行转列,列转行,多列转一行,一行转多列,具有一定的参考价值,感兴趣的可以了解一下
      2023-08-08
    • 这篇文章主要介绍了MySQL与存储过程的相关资料,需要的朋友可以参考下
      2007-03-03
    • 索引并不是时时都会生效的,遇到一些情况将导致索引失效,下面这篇文章主要给大家介绍了关于SQL索引失效的11种情况,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
      2023-03-03
    • 本文主要给大家通过一个实例来具体介绍MySQL死锁问题的相关知识,接下来我们就来一一介绍这部分内容,希望能够对您有所帮助。
      2016-11-11
    • 很多人可能会把日期类型的字段的类型设置为date或者datetime,
      但是这两个类型是无法设置默认值为当前日期的,下面这篇文章主要给大家介绍了关于mysql时间字段默认设置为当前时间的相关资料,需要的朋友可以参考下
      2022-08-08
    • mysql的索引使用不当速度比没加索引还慢,我们举个例子来解释一下。
      2011-08-08
    • 这篇文章主要介绍了mysql创建的外键无法保存的原因以及处理办法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
      2022-09-09
    • 这篇文章主要介绍了Mysql两表 join 查询方式,主要包括SQL基本语法格式ji3种join方式,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
      2022-10-10
    • 这篇文章主要介绍了MySQL 的启动选项和系统变量,结合实例形式详细分析了MySQL 启动选项和系统变量具体原理、功能、用法及操作注意事项,需要的朋友可以参考下
      2020-05-05

    最新评论