引言: 一些团队内部会有一些约定俗成的制度来规避一些常见的性能问题,如禁止使用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等资源消耗情况。
具体能提供什么资源的消耗情况?
关于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