橡皮擦擦

MySQL性能监控:使用SHOW PROFILE进行SQL性能分析

MySQL

引言: 一些团队内部会有一些约定俗成的制度来规避一些常见的性能问题,如禁止使用SELECT
、InnoDB大表避免使用COUNT()之类...... 当出现了性能问题时我们则需要对症下药,不能拍脑袋的就给用到的字段加个索引、拆表、重建去解决问题。
我们都知道一般会对SQL使用Explain进行分析与优化,那除了该方式还有别的办法能对SQL的执行情况进行分析么? 它就是——SHOW
PROFILE


SHOW PROFILE能做什么?

它可以列出一条SQL语句从开始->执行->结束->清理过程中各个资源的消耗情况(CPU、上下文切换、IO等)与SQL所处步骤所消耗时间(权限检查、初始化、打开表、发送数据等),使你可以快速定位问题点,从而找到问题原因对症下药。

mysql> SHOW PROFILE;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000348 |
| checking permissions | 0.000024 |
| Opening tables       | 0.000030 |
| init                 | 0.000045 |
| System lock          | 0.000051 |
| optimizing           | 0.000019 |
| statistics           | 0.000021 |
| preparing            | 0.000021 |
| executing            | 0.000015 |
| Sending data         | 0.000096 |
| end                  | 0.000030 |
| query end            | 0.000022 |
| closing tables       | 0.000022 |
| freeing items        | 0.000099 |
| cleaning up          | 0.000032 |
+----------------------+----------+
15 rows in set, 1 warning (0.00 sec)

可以从输出的表格中看到各个步骤对应的执行时间,你也可以使用show profile all来查看CPU、IO等资源消耗情况。

具体能提供什么资源的消耗情况?

DEAFB1CE-789A-416D-A209-0E949282BFF9.png
关于Status字段的相关数据字典可以在以下官方文档内查看:
https://dev.mysql.com/doc/refman/8.0/en/general-thread-states.html

该如何使用它?

在使用前你需要开启相关配置(未开启配置前的SQL是不会记录的):

# 查看当前session是否开启了profiling(为0则没有开启)
mysql> SELECT @@profiling;

# 开启profiling
mysql> SET profiling = 1;

# 该命令会输出记录下来的SQL列表
mysql> SHOW PROFILES;
+----------+------------+-----------------------+
| Query_ID | Duration   | Query                 |
+----------+------------+-----------------------+
|        1 | 0.00087275 | select * from u_delay |
+----------+------------+-----------------------+
1 row in set, 1 warning (0.00 sec)

# 该命令会展示出最近一条记录的SQL信息
mysql> SHOW PROFILE;

# 当你加入ALL或其他参数时会展示该SQL对应上述表格中对应的开销信息(多个参数使用逗号分割)
mysql> SHOW PROFILE ALL;

# 输入FOR QUERY参数可以指定需要查询的SQL ID,不指定的话默认为最近的一条
mysql> SHOW PROFILE ALL FOR QUERY [id];

# 也可以使用limie与offset来限制输出与设置偏移点
mysql> SHOW PROFILE ALL FOR QUERY [id] LIMIT [n] OFFSET [n];

# 停止profile,在session退出之后profiling也会被自动关闭
mysql> set profiling=off;

通过语句得出分析结果后,针对资源瓶颈或对应status步骤进行针对性的优化即可。
需要注意的事项
在官方手册中已经说明该特性在未来会被启用,但是目前MySQL 8版本与之前版本上是依旧可以继续使用的。
在之后的版本里建议使用performance_schema库的setup_actors表进行性能分析。
setup_actors表可用于限制按主机、用户或帐户收集历史事件,以减少运行时开销和历史表中收集的数据量。
相关使用方式详见:https://dev.mysql.com/doc/refman/8.0/en/performance-schema-query-profiling.html

点我评论
打赏本文
二维码


51

文章

6

分类