在MySQL数据库的日常运维和性能排查中,查看线程和连接状态是定位问题的基础操作,通过相关状态信息可以快速判断当前数据库是否存在连接数过高、线程阻塞、慢查询堆积等问题。

一、使用SHOW PROCESSLIST命令查看基础状态
SHOW PROCESSLIST是MySQL内置的基础命令,能够快速展示当前所有连接的线程状态,适合快速排查简单问题。该命令不需要额外配置,默认情况下普通用户只能查看自己的线程,拥有PROCESS权限的用户可以查看所有线程。
命令的基本用法如下:
-- 查看所有线程和连接状态,完整展示信息 SHOW FULL PROCESSLIST; -- 查看所有线程和连接状态,截断过长的Info字段 SHOW PROCESSLIST;
命令返回的结果包含以下关键字段:
- Id:线程的唯一标识,对应连接的线程ID,可以用来终止指定线程
- User:发起连接的用户
- Host:发起连接的客户端地址和端口
- db:当前线程操作的数据库,没有选择数据库时为NULL
- Command:线程当前执行的命令类型,比如Query、Sleep、Connect等
- Time:当前状态持续的时间,单位是秒
- State:线程的当前状态,比如Sending data、Locked、Sorting result等
- Info:线程正在执行的SQL语句,FULL模式下会展示完整语句
二、通过information_schema库查看连接状态
除了SHOW PROCESSLIST命令,还可以通过查询information_schema库的PROCESSLIST表获取线程和连接状态,这种方式支持更灵活的条件过滤,适合需要筛选特定状态的场景。
基础的查询示例如下:
-- 查询所有线程信息,和SHOW FULL PROCESSLIST效果一致 SELECT * FROM information_schema.PROCESSLIST; -- 筛选执行时间超过10秒的查询线程 SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM information_schema.PROCESSLIST WHERE COMMAND != 'Sleep' AND TIME > 10; -- 查看当前连接数 SELECT COUNT(*) AS current_connections FROM information_schema.PROCESSLIST;
三、使用performance_schema获取更详细的状态信息
如果需要更详细的线程运行指标,比如线程的内存使用、等待事件、历史执行情况等,可以查询performance_schema库下的相关表,不过需要先确保performance_schema是开启状态。
先检查performance_schema是否开启:
-- 查看performance_schema开启状态,ON为开启 SHOW VARIABLES LIKE 'performance_schema';
如果未开启,可以在配置文件my.cnf中添加performance_schema=ON后重启MySQL,或者在支持动态修改的版本中执行以下命令:
-- 动态开启performance_schema,部分版本可能需要重启生效 SET GLOBAL performance_schema = ON;
常用的查询线程状态的表如下:
| 表名 | 作用说明 |
|---|---|
| threads | 存储所有服务器线程的详细信息,包括线程类型、启动时间、关联的用户等 |
| events_statements_current | 存储当前正在执行的语句信息,包含语句的执行状态、耗时等 |
| events_waits_current | 存储线程当前的等待事件信息,可以用来排查线程阻塞原因 |
查询示例:
-- 查看所有线程的基础信息 SELECT THREAD_ID, NAME, TYPE, PROCESSLIST_ID, PROCESSLIST_USER, PROCESSLIST_HOST FROM performance_schema.threads; -- 查看当前正在执行的语句的耗时和状态 SELECT es.THREAD_ID, es.SQL_TEXT, es.TIMER_WAIT/1000000000 AS exec_time_ms, t.PROCESSLIST_USER FROM performance_schema.events_statements_current es JOIN performance_schema.threads t ON es.THREAD_ID = t.THREAD_ID WHERE es.SQL_TEXT IS NOT NULL;
四、常见状态说明与问题排查
查看线程状态时,不同的State值对应不同的运行情况,以下是几个常见的状态说明:
- Sleep:线程处于空闲状态,等待客户端发送新的请求,长时间Sleep的线程可以评估是否需要关闭
- Query:线程正在执行查询语句,如果Time值过大,可能是慢查询
- Locked:线程被锁住,通常是表锁或者行锁导致的阻塞,需要排查锁竞争问题
- Sending data:线程正在向客户端发送查询结果,如果耗时过长,可能是返回的数据量过大
- Sorting result:线程正在对结果进行排序,排序数据量过大可能导致耗时增加
如果需要终止异常的线程,可以使用KILL命令,注意需要对应线程的Id:
-- 终止指定Id的线程,Id来自SHOW PROCESSLIST或者information_schema.PROCESSLIST的ID字段 KILL 123; -- 终止连接,会关闭对应的连接并终止线程 KILL CONNECTION 123;
五、查看最大连接数配置
除了查看当前连接状态,还可以查看MySQL的最大连接数配置,判断当前连接数是否接近上限:
-- 查看最大连接数配置 SHOW VARIABLES LIKE 'max_connections'; -- 查看历史最大连接数,判断是否曾经达到过上限 SHOW STATUS LIKE 'Max_used_connections';
如果当前连接数经常接近max_connections,可以适当调大最大连接数配置,避免新的连接无法建立。
MySQL线程状态连接状态SHOW_PROCESSLISTperformance_schema修改时间:2026-06-09 06:15:31