
MySQL运行时的可观测性
- 1. 说在前面的话
- 2. 安装employees测试库
- 3. 观测SQL运行状态
- 3.1 观测SQL运行时的内存消耗
- 3.2 观测SQL运行时的其他开销
- 3.3 观测SQL运行进度
感知SQL运行时的状态
1. 说在前面的话
在MySQL里,一条SQL运行时产生多少磁盘I/O,占用多少内存,是否有创建临时表,这些指标如果都能观测到,有助于更快发现SQL瓶颈,扑灭潜在隐患。
从MySQL 5.7版本开始,performance_schema
就默认启用了,并且还增加了sys schema
,到了8.0版本又进一步得到增强提升,在SQL运行时就能观察到很多有用的信息,实现一定程度的可观测性。
下面举例说明如何进行观测,以及主要观测哪些指标。
2. 安装employees测试库
安装MySQL官方提供的employees
测试数据库,戳此链接(https://dev.mysql.com/doc/index-other.html)下载,解压缩后开始安装:
MySQL还提供了相应的使用文档:https://dev.mysql.com/doc/employee/en/
本次测试采用GreatSQL 8.0.32-24版本,且运行在MGR环境中:
3. 观测SQL运行状态
查看当前连接/会话的连接ID、内部线程ID:
查询得到当前的连接ID=110,内部线程ID=207。
P.S,由于本文整理过程不是连续的,所以下面看到的 thread_id 值可能会有好几个,每次都不同。
3.1 观测SQL运行时的内存消耗
执行下面的SQL,查询所有员工的薪资总额,按员工号分组,并按薪资总额倒序,取前10条记录:
看到需要全索引扫描(其实也等同于全表扫描,因为是基于PRIMARY索引),并且还需要生成临时表,以及额外的filesort。
在正式运行该SQL之前,在另外的窗口中新建一个连接会话,执行下面的SQL先观察该连接/会话当前的内存分配情况:
等到该SQL执行完了,再一次查询内存分配情况:
我们注意到几个数据的变化情况,用下面表格来展示:
指标 | 运行前 | 运行后 |
total_allocated | 30311 | 95719 |
也就是说,SQL运行时,需要分配的内存是:95719 - 30311 = 65408 字节。
3.2 观测SQL运行时的其他开销
通过观察 performance_schema.status_by_thread
表,可以知道相应连接/会话中SQL运行的一些状态指标。在SQL运行结束后,执行下面的SQL命令即可查看:
上面我们只罗列了部分比较重要的状态指标。从这个结果也可以佐证slow query log中的结果,确实没创建临时表。
作为参照,查看这条SQL对应的slow query log记录:
可以看到,Created_tmp_disk_tables
, Created_tmp_tables
, Handler_read_next
, Select_full_join
, Select_scan
, Sort_rows
, Sort_scan
, 等几个指标的数值是一样的。
还可以查看该SQL运行时的I/O latency情况,SQL运行前后两次查询对比:
可以看到这个SQL运行时的I/O latency是:85.29 - 75.39 = 9.9us。
3.3 观测SQL运行进度
我们知道,运行完一条SQL后,可以利用PROFLING功能查看它各个阶段的耗时,但是在运行时如果也想查看各阶段耗时该怎么办呢?
从MySQL 5.7版本开始,可以通过 performance_schema.events_stages_%
相关表查看SQL运行过程以及各阶段耗时,需要先修改相关设置:
这就实时可以观测SQL运行过程中的状态了。
在SQL运行过程中,从另外的窗口查看该SQL对应的 EVENT_ID
:
上面就是这条SQL的运行进度展示,以及各个阶段的耗时,和PROFILING
的输出一样,当我们了解一条SQL运行所需要经历的各个阶段时,从上面的输出结果中也就能估算出该SQL大概还要多久能跑完,决定是否要提前kill它。
如果想要观察DDL SQL的运行进度,可以参考这篇文章:不用MariaDB/Percona也能查看DDL的进度。
更多的观测指标、维度还有待继续挖掘,以后有机会再写。
另外,也可以利用MySQL Workbench工具,或MySQL Enterprise Monitor,都已集成了很多可观测性指标,相当不错的体验。
延伸阅读
- Query Profiling Using Performance Schema, https://dev.mysql.com/doc/refman/8.0/en/performance-schema-query-profiling.html
- 不用MariaDB/Percona也能查看DDL的进度
- 事件记录 | performance_schema全方位介绍
- 内存分配统计视图 | 全方位认识 sys 系统库
Enjoy GreatSQL :)
文章转载自公众号:GreatSQL社区
