MySQL中使用PROFILING来查看SQL执行流程

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

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

1、开启Profiling

1.1、本次测试的环境

sql 复制代码
(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

sql 复制代码
(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查询。

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

sql 复制代码
(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的查询编号,然后使用以下命令:

sql 复制代码
(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等:

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

相关推荐
qq_5298353517 分钟前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
月光水岸New3 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6753 小时前
数据库基础1
数据库
我爱松子鱼3 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo3 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser4 小时前
【SQL】多表查询案例
数据库·sql
Galeoto4 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)5 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231115 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
喝醉酒的小白5 小时前
PostgreSQL:更新字段慢
数据库·postgresql