SHOW GLOBAL STATUS 源码实现原理是什么?
摘要:问题 在 MySQL 中,查询全局状态变量的方式一般有两种:SHOW GLOBAL STATUS和performance_schema.global_status。 但不知道大家注意到没有,performance_schema.global
问题
在 MySQL 中,查询全局状态变量的方式一般有两种:SHOW GLOBAL STATUS和performance_schema.global_status。
但不知道大家注意到没有,performance_schema.global_status 返回的状态变量数要远远少于 SHOW GLOBAL STATUS 。
具体来说,
在 MySQL 8.4.2 中,SHOW GLOBAL STATUS 返回了 503 个变量,而 performance_schema.global_status 只返回了 336 个。
在 MySQL 5.7.44 中,SHOW GLOBAL STATUS 返回了 354 个变量,而 performance_schema.global_status 只返回了 207 个。
有的童鞋可能会认为这两者的实现方式不一样,但事实上,从 MySQL 5.7 开始,当执行 SHOW GLOBAL STATUS 时,MySQL 并不是直接从内存中的状态变量获取数据,而是通过查询 performance_schema.global_status 表来间接获取。
既然两者的实现方式是一样的,为什么返回的变量数会不一样?
带着这个问题,接下来我们具体分析下 SHOW GLOBAL STATUS 的实现原理。本文主要包括以下几个部分:
状态变量是在哪里定义的?
状态变量值的来源。
SHOW GLOBAL STATUS 的实现原理。
performance_schema.global_status 的实现原理。
为什么 performance_schema.global_status 返回的变量数比 SHOW GLOBAL STATUS 少。
状态变量是在哪里定义的?
状态变量的来源主要有三个:
Server 层面的状态变量:这些状态变量主要在status_vars(mysqld.cc)中定义。在 MySQL 8.4 中,共有 321 个状态变量。其中包括了 com_status_vars 中定义的 167 个 Com 相关的变量。
插件中的状态变量:
InnoDB:在innodb_status_variables(ha_innodb.cc)中定义 ,共 76 个。
半同步复制:在semi_sync_master_status_vars(semisync_source_plugin.cc)中定义,共 14 个,从库只有 1 个。
组复制:在group_replication_status_vars(plugin.cc)中定义,共 22 个。
performance_schema:在pfs_status_vars(ha_perfschema.cc)中定义,共 33 个。
mysqlx:在m_plugin_status_variables(status_variables.cc)中定义,共 78 个。
Component 中的状态变量:例如,在密码认证插件 validate_password 中定义的状态变量。
这些变量会通过add_status_vars函数添加到一个数组中 all_status_vars。注意这个数组名,后面讲解原理时会用到。
