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的发展,你应该考虑使用更现代和强大的性能分析工具。

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下两种方式查看MySQLSQL执行效率: 1. 使用`EXPLAIN`语句查看SQL查询计划 `EXPLAIN`是MySQL的一个关键字,可以用来查看查询语句的执行计划,从而了解MySQL是如何处理查询语句的。具体操作步骤如下: 1) 执行`EXPLAIN SELECT * FROM table_name WHERE condition;`查询语句,其`table_name`为表名,`condition`为查询条件。 2) 查看查询结果,MySQL会返回一张表格,包含了查询语句的执行计划。 查询结果的每一行对应着MySQL执行计划的一个步骤,每一列则是该步骤的具体信息,比如: - `id`:标识该步骤在执行计划的唯一ID。 - `select_type`:表示该步骤的查询类型,比如SIMPLE、PRIMARY等。 - `table`:表示该步骤所涉及的表名。 - `type`:表示该步骤的访问类型,比如ALL、INDEX等。 - `possible_keys`:表示该步骤可能使用的索引。 - `key`:表示该步骤实际使用的索引。 - `key_len`:表示该步骤使用的索引长度。 - `ref`:表示该步骤使用的索引所依赖的列。 - `rows`:表示该步骤扫描的行数。 - `Extra`:表示该步骤的附加信息。 通过查看这些信息,可以了解SQL查询语句在MySQL的执行计划,进而优化SQL查询语句的性能。 2. 使用`SHOW PROFILE`语句查看SQL执行时间 `SHOW PROFILE`是MySQL的一个关键字,可以用来查看SQL查询语句在MySQL的执行时间,包括SQL执行过程各个阶段的耗时。具体操作步骤如下: 1) 执行`SET profiling=1;`命令,开启MySQL的查询分析功能。 2) 执行需要分析的SQL查询语句。 3) 执行`SHOW PROFILES;`命令,查看SQL查询语句的执行情况。 查询结果的每一行对应着SQL查询语句的一个阶段,每一列则是该阶段的具体信息,比如: - `Query_ID`:标识该阶段在查询过程的唯一ID。 - `Duration`:表示该阶段的执行时间(单位为秒)。 - `Query`:表示该阶段所对应的SQL查询语句。 - `Status`:表示该阶段的状态,比如starting、executing、sending data等。 通过查看这些信息,可以了解SQL查询语句在MySQL的执行时间,进而优化SQL查询语句的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值