可以看到,information_schema.profiling中的第三列(STATE,对应 show profile for query N 中的 Status)存储的是上一条记录的 status(阶段名),而第四列(DURATION)的值等于当前记录的采集时间(entry->time_usecs)减去上一条记录的采集时间(previous->time_usecs)。
所以,我们在show profile for query N中看到的 Duration 实际上通过下一个阶段的采集时间减去当前阶段的采集时间得到的,并不是show profile source中函数(Source_function)的实行时长。
这种实现方式在判断操作当前状态和分析各个阶段耗时时存在一定的误导性。
回到开头的 case。
表空间导入操作为什么大部门耗时是在 System lock 阶段?
这种实现方式在判断操作当前状态(通过 SHOW PROCESSLIST)和分析各个阶段耗时(通过 SHOW PROFILE )时存在一定的误导性,主要是由于预定义的阶段数量是有限的。
在 MySQL 8.4 中,共定义了 98 个阶段,详细的阶段名可在mysqld.cc中的all_server_stages数组找到。