0. 引言
要想进阶针对mysql学习乃至掌握mysql调优的基本技能,监控mysql的执行情况必不可少。就像我们的代码,如果不能debug,想要进行调优排错,难度将会大大增加。
所以今天我们就来讲解如何监控mysql的sql执行情况
1. show profile指令
1.1 什么是show profile?
show profile是mysql提供的用来分析当前会话中sql语句执行的资源消耗情况,利用它我们可以用来分析sql的性能,作为调优的测量工具
show profile默认是关闭的,可以通过set profiling=1;
指令来开启,但是需要注意的是每次开启只是生效在当前会话中,想要永久生效的话需要修改mysql配置文件
1.2 如何使用show profile?
1、首先开启show profile,mysql中执行指令
set profiling=1;
复制
2、我们运行一段测试的sql
select * from user_test.user where id in (select id from user_test.food);
复制
3、执行show profiles;
查询最近执行的sql的情况

如上图所示,我们可以看到,我们刚刚执行的这条sql的执行时间为0.00054s,queryId为243
4、那么我们还可以通过这个queryId进阶监控这个sql的其他资源消耗情况,比如查询其CPU的消耗情况
show profile CPU for query 243;
复制

其中status
表示的是sql指定的各个阶段的状态,duration
表示的是各个状态的耗时,cpu_user
表示当前用户占用的cpu,cpu_system
表示系统占用的cpu
结果分析:通过上述结果可知,我们执行的sql的大部分时间消耗在启动上,其次消耗在打开table,真正花在执行上的时间只有0.000061s
除了上述演示的监控cpu的资源消耗,show profile还提供了如下的监控类型 |监控类型|语句| |-|-| |显示所有性能信息|all| |显示块IO开销|block io| |显示上下文开销|context switches| |显示用户cpu时间、系统cpu时间|cpu| |显示发送和接收的消息数量|ipc| |显示页错误数量|page faults| |显示源码中的函数名称与位置|source| |显示swap的次数|swaps|
指令格式:
show profile [type] [for query query_id]
复制
另外一个常用的指令是show profile;
,这个是用于查询最近一个profiling信息
注意
: show profile在mysql5.7中就已经显示过时了,虽然仍然可用,但mysql推荐更还用的performance_schema
语句来监控sql执行情况
2. performance_schema
2.1 什么是performance_schema?
performance_schema实际上是一个数据库,我们可以通过数据库查询指令show databases;
或者像navicat这样的数据库管理软件查看到该数据库。

performance_schema是用于监控mysql在一个较低级别的运行过程中的资源消耗、资源等待的情况。它提供了一系列的表格,这些表格中存储了关于数据库运行期间的性能相关的数据,如磁盘、IO、锁、CPU等相关信息。
performance_schema比show profile更加详尽,5.6版本后默认是开启的,可以在mysql配置文件中看到配置项
[mysqld]
performance_schema=ON
复制
performance_schema采用的是performance_schema存储引擎,而非innodb或者mysiam、memory
2.2 performance_schema表分类
分类 | 表名 |
语句事件记录表 | show tables like '%statement%'; |
当前语句事件表 | events_statements_current |
历史语句事件表 | events_statements_history |
长语句历史事件表 | events_statements_history_long |
摘要表 | summary |
等待事件记录表,与语句事件类型的相关记录表类似 | show tables like '%wait%'; |
阶段事件记录表,记录语句执行的阶段事件的表 | show tables like '%stage%'; |
事务事件记录表,记录事务相关的事件的表 | show tables like '%transaction%'; |
监控文件系统层调用的表 | show tables like '%file%'; |
监控内存使用的表 | show tables like '%memory%'; |
动态对performance_schema进行配置的配置表 | show tables like '%setup%'; |
2.2 如何使用performance_schema?
instruments和consumers
在开始讲述performance_schema的使用之前,我们要先了解两个概念:
•instruments:生产者,用于采集mysql中各种各样的操作产生的事件信息,对应setup_instruments配置表中的配置项,也可以称为监控采集配置项•consumers:消费者,对应的消费者表用于存储来自instruments采集的数据,对应setup_consumers配置表中的配置项,可以称为消费存储配置项
虽然performance_schema默认是开启的,但是数据库刚启动时并非所有的采集项都打开了,也就是说,默认不会采集所有的事件。
有可能你需要检测的事件并没有打开,那么就需要我们手动将对应项打开。
比如打开等待时间的采集器开关,需要修改setup_instruments表中对应的采集器配置项
update setup_instruments set ENABLED='YES',TIMED='YES' where name like 'wait%';
复制
打开等待事件的保存表配置开关,需要修改setup_consumers配置表中对应的配置项
update setup_consumers set ENABLE='YES' where name like '%wait%';
复制
常用查询
4. 其他监控指令
4.1 show processlist 监控连接线程数
show processlist指令可以查询到mysql当前的连接线程,以此来监控mysql是否有大量线程数连接,从而进行排查
show processlist
复制
执行结果

4.2 last_query_cost 监控数据页
mysql中是以数据页为单位来存储数据的,last_query_cost指令用于查询最近一次查询需要查找多少个数据页。查找的数据页越多,IO越高,性能越差
show status like 'last_query_cost';
复制
执行结果

文中代码可通过点击阅读原文获取
Elastic认证工程师学习营地
程序员的充电桩
更多免费学习资料尽在其中

Elastic开源社区
点赞分享加关注
学习开车两不误

你们点点“分享”,给我充点儿电吧~