要查看MySQL中当前正在执行的查询,可以使用以下SQL语句查询performance_schema.events_statements_current
表:
SELECT * FROM performance_schema.events_statements_current;
关键细节说明:
-
功能作用
该表实时显示 每个线程最近一条执行的SQL语句(包括正在运行或刚结束的语句)。是诊断数据库性能问题的核心工具。 -
核心字段解析:
字段名 说明 THREAD_ID
执行线程的唯一ID EVENT_NAME
事件类型(如 statement/sql/select
)SQL_TEXT
实际执行的SQL文本(可能被截断) DIGEST_TEXT
标准化后的SQL(脱敏参数,用于分析模式) TIMER_WAIT
执行耗时(皮秒) ROWS_EXAMINED
扫描的行数 ROWS_AFFECTED
影响的行数(UPDATE/DELETE) CREATED_TMP_TABLES
创建的临时表数量 NO_INDEX_USED
是否未使用索引(1=是) NESTING_EVENT_ID
嵌套事件ID(如存储过程中的SQL) STATE
当前状态( RUNNING
/COMPLETED
) -
典型使用场景:
-
定位长时间运行的查询(结合
WHERE STATE='RUNNING'
) -
分析慢查询的扫描行数、临时表使用
-
追踪未使用索引的语句(
NO_INDEX_USED=1
)
-
-
重要限制:
-
仅显示最近一条语句:每个线程只记录最后执行的语句。
-
需要启用配置:
-- 检查是否启用 SELECT * FROM performance_schema.setup_consumers WHERE NAME = 'events_statements_current'; -- 若未启用需执行 UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME = 'events_statements_current';
-
权限要求:用户需有
SELECT
权限和performance_schema
访问权限。
-
操作示例:
-- 查看正在运行的查询输出秒
SELECT
THREAD_ID,
SQL_TEXT,
TIMER_WAIT/1000000000000 AS exec_seconds,
ROWS_EXAMINED
FROM performance_schema.events_statements_current
HAVING exec_seconds> 0.1 ORDER BY exec_seconds DESC LIMIT 10;
输出示例:
提示:对于生产环境,建议配合
sys.session
视图使用(需要安装sys
库),可获取更友好的可读信息。