不能。sys.session视图仅展示连接基础信息,不包含等待事件;需使用sys.session_wait或performance_schema.events_waits_current等视图查看实时等待。

sys.session视图能直接看到当前会话的等待事件吗
不能。sys.session默认只展示连接基础信息(如conn_id、user、current_statement),不包含等待事件。它底层基于performance_schema.threads和events_statements_current,但做了聚合裁剪。真要看等待,得切到performance_schema原生视图,或者用sys里专为等待设计的视图。
哪些sys视图真正暴露了wait事件
只有三个视图明确关联等待数据:
-
sys.session本身不带wait字段,别被名字误导 -
sys.session_wait:每行对应一个活跃会话的**当前正在发生的等待事件**(来自performance_schema.events_waits_current) -
sys.x$session_wait:和sys.session_wait结构一致,但字段名不带单位、数值为原始整数(比如latency是皮秒值,不是格式化后的"123.45 ms")
注意:sys.wait_classes_global_by_avg_latency这类是**历史聚合统计**,不是实时等待快照,排查“此刻卡在哪”时用不上。
查实时等待必须开performance_schema且配对启用
即使用了sys.session_wait,背后依赖的performance_schema若没开或等待采集被关,结果就是空。确认两件事:
- 执行
show variables like 'performance_schema',值必须是ON - 检查等待事件采集是否启用:
select * from performance_schema.setup_consumers where name = 'events_waits_current',ENABLED列必须是YES - MySQL 8.0+默认开启,但老版本或定制部署可能手动关过,别跳过验证
常见坑:开了performance_schema但events_waits_current消费者被设为NO,导致sys.session_wait始终返回空结果。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
一条命令快速定位阻塞源头
想立刻知道“谁在等什么、被谁堵着”,直接跑这个:
SELECT esh.event_name, esh.source, esh.timer_wait/1000000000 AS wait_sec,
esh.thread_id, t.processlist_id, t.processlist_user, t.processlist_host
FROM performance_schema.events_waits_current esh
JOIN performance_schema.threads t ON esh.thread_id = t.thread_id
WHERE esh.EVENT_NAME != 'idle' AND esh.timer_wait > 0
ORDER BY esh.timer_wait DESC LIMIT 5;
关键点:
-
timer_wait/1000000000把皮秒转成秒,方便肉眼判断是否真卡住 - 过滤
idle避免干扰,只看真实等待 - 关联
threads拿到processlist_id,方便后续用KILL或SHOW PROCESSLIST交叉验证
如果看到大量wait/io/table/sql/handler,大概率是全表扫描缺索引;如果是wait/synch/mutex/innodb/...,就要查INNODB STATUS看锁了——sys库不负责锁分析,那是information_schema和performance_schema.data_locks的事。










