show status返回的是mysql内部累计计数器,非实时快照;threads_running反映瞬时压力,questions与queries统计范围不同,需对比差值看变化,不包含cpu/内存等系统指标。

show status 返回的数值都是啥意思
MySQL 的 SHOW STATUS 不是“状态仪表盘”,它返回的是自启动以来的累计计数器(比如 Threads_connected 是当前连接数,但 Queries 是总执行语句数),不是实时负载快照。直接扫一眼容易误判——比如 Slow_queries 突然变高,未必是现在慢,可能是凌晨批处理刚跑完留下的痕迹。
实操建议:
- 优先关注带
Threads_前缀的值:Threads_running(真正正在执行的线程数)比Threads_connected更反映瞬时压力 -
Questions和Queries不等价:Questions只算客户端发来的原始语句,Queries还包含内部执行的语句(如存储过程里的子查询) - 想看最近变化?用两次
SHOW STATUS对比差值,或直接连information_schema.PROCESSLIST查活线程
为什么 show status 里找不到 CPU 或内存占用
SHOW STATUS 本身不采集操作系统级指标,它只暴露 MySQL 内部统计项。你不会看到 CPU_usage 或 Memory_used_mb 这类字段——这不是 bug,是设计如此。
实操建议:
- 查 CPU/内存必须切到系统层:
top、htop、ps aux --sort=-%cpu | grep mysqld - MySQL 8.0+ 可通过 performance_schema 查部分资源消耗,比如
performance_schema.memory_summary_global_by_event_name,但需提前开启对应 instrument - 别指望靠
SHOW STATUS判断服务器是否要 OOM;Key_buffer_usage或Innodb_buffer_pool_pages_free这类才和内存分配有关联
show status 和 show global status 有啥区别
没区别。MySQL 5.7 起 SHOW STATUS 默认就是全局作用域,SHOW GLOBAL STATUS 是冗余写法,两者输出完全一致。官方文档也明确写了 “GLOBAL is the default”。
实操建议:
- 不用刻意加
GLOBAL,省得打字出错 - 真要查会话级状态(极少用),得用
SHOW SESSION STATUS,但只有极少数变量支持会话维度(如auto_increment_offset) - 注意权限:普通用户可能看不到全部状态项,报错
Access denied for user ... to database 'performance_schema'是权限不足,不是语法问题
用 show status 诊断高负载时最常踩的坑
很多人一遇到响应慢,就跑 SHOW STATUS 然后盯着 Threads_created 或 Aborted_connects 猛看,结果白忙活。这些指标本身不说明“现在卡”,只提示“过去可能出过问题”。
实操建议:
-
Threads_created高 ≠ 当前连接多,而是说明连接池没配好,频繁新建线程——该查应用端连接复用配置 -
Table_locks_waited在 InnoDB 表上永远是 0,因为 InnoDB 不用表锁;这里非零只代表 MyISAM 表被堵了 -
Created_tmp_disk_tables比Created_tmp_tables更关键:前者表示排序/分组被迫落盘,性能杀手;后者只是临时表总数,很多是内存里的 - 别单独看一个值,要组合判断:比如
Sort_merge_passes高 +Sort_range低,大概率是sort_buffer_size太小
复杂点在于,SHOW STATUS 的每个数字背后都绑着配置、引擎行为、甚至 SQL 写法。光看状态不结合 EXPLAIN 和慢日志,很容易把症状当病因。











