SHOW VARIABLES 查 MySQL 启动时加载的配置参数(如 max_connections、innodb_buffer_pool_size),决定行为边界,可静态或动态修改;SHOW STATUS 查运行时累积/瞬时状态指标(如 Threads_connected、Innodb_buffer_pool_reads),只读且不可修改,反映实际运行状况。

SHOW VARIABLES 查的是 MySQL 启动时加载的配置参数(含默认值和配置文件/启动项覆盖后的结果),SHOW STATUS 查的是运行时累积或瞬时的状态指标——两者不混用,也不能互相替代。
SHOW VARIABLES 用来查“MySQL 认为自己该怎么做”
它返回的是变量(variables),即服务端的配置决策点,比如内存分配、日志开关、字符集、超时时间等。这些值决定了 MySQL 的行为边界。
- 查全部:
SHOW VARIABLES;输出几百行,建议配合客户端搜索或终端管道过滤,例如mysql -e "SHOW VARIABLES;" | grep -i buffer - 精确匹配单个参数:
SHOW VARIABLES LIKE 'max_connections';支持%通配,如'%innodb%buffer%' - 查全局值(推荐脚本调用):
SELECT @@global.innodb_buffer_pool_size;返回纯数字,无单位、无额外格式 - 查会话级值(如
sql_mode):SELECT @@session.sql_mode;注意:不是所有变量都有 session 级别 - 修改后立即生效?仅限部分变量支持
SET SESSION xxx = ...;SET GLOBAL修改只影响新连接,旧连接保持原值
SHOW STATUS 用来查“MySQL 实际正在发生什么”
它返回的是状态(status variables),是运行过程中统计出来的指标,比如当前连接数、缓存命中次数、临时表创建量、InnoDB 页面读取请求等。它们不可写,只读取。
- 查全部:
SHOW STATUS;行数多(常超 500 行),建议限定范围,例如SHOW STATUS LIKE 'Threads%'; - 关键连接类指标:
Threads_connected(当前活跃连接)、Connections(自启动以来总连接数)、Aborted_connects(失败连接数,过高需查防火墙或认证问题) - 缓存与 IO 类:
Innodb_buffer_pool_read_requests(缓冲池逻辑读请求数)、Innodb_buffer_pool_reads(实际物理读次数,二者比值低说明缓存效率差) - 临时对象:
Created_tmp_tables和Created_tmp_disk_tables,后者占比高说明tmp_table_size或max_heap_table_size设得太小 - 注意:
SHOW STATUS默认只返回当前会话的统计;加GLOBAL前缀才看全局累计值,例如SHOW GLOBAL STATUS LIKE 'Qcache%';(但 MySQL 8.0+ 已移除查询缓存)
容易混淆的三个常见误区
很多人把这两个命令当“同一类操作”,结果查错维度、误判问题根源。
-
max_connections是 variables,表示“最多允许多少连接”,而Threads_connected是 status,表示“此刻连着几个”。前者设低会导致连接被拒,后者飙高说明业务并发突增或连接没释放 -
innodb_buffer_pool_size在SHOW VARIABLES里是配置值,在SHOW ENGINE INNODB STATUS\G里能看到实际使用率(Buffer pool hit rate),但不在SHOW STATUS中——它属于引擎内部状态,得用专用命令 -
mysqladmin -u root -p variables和mysqladmin -u root -p status是命令行等价命令,适合写监控脚本;但它们输出格式与 SQL 命令略有不同,字段名大小写、空格处理需留意
真正要定位性能瓶颈时,得先分清:你是在确认“配置是否合理”,还是在观察“运行是否异常”。前者盯 SHOW VARIABLES,后者盯 SHOW STATUS,中间夹着的那些动态调整项(比如 sort_buffer_size 可 session 级改但不进 status 统计),最容易漏掉验证环节。


















