在 MySQL 中,如果 SQL 太多且运行时间长,你可以通过查询 information_schema.PROCESSLIST 表来查看正在运行的 SQL,并按执行时间(TIME 字段)进行排序。
1. 查看正在运行的 SQL 并按执行时间降序排序
执行以下 SQL 语句:
SELECT
ID,
USER,
HOST,
DB,
COMMAND,
TIME,
STATE,
INFO
FROM
information_schema.PROCESSLIST
WHERE
COMMAND != 'Sleep' -- 排除空闲连接
ORDER BY
TIME DESC; -- 按执行时间从长到短排序
字段说明:
ID: 进程 ID,用于杀死会话。USER: 执行该 SQL 的用户。HOST: 客户端主机。DB: 当前连接的数据库。COMMAND: 当前命令类型(如 Query, Sleep, Connect 等)。TIME: 执行时间(秒),这是排序的关键字段。STATE: 当前状态(如 sending data, sorting result 等)。INFO: 正在执行的 SQL 语句内容(如果语句太长可能会被截断)。
2. 只查看执行时间超过特定阈值的 SQL
如果你想找出执行时间超过例如 10 秒 的慢 SQL:
SELECT
ID,
USER,
TIME,
INFO
FROM
information_schema.PROCESSLIST
WHERE
COMMAND != 'Sleep'
AND TIME > 10
ORDER BY
TIME DESC;
3. 生成批量杀死慢查询的语句
如果发现某些 SQL 卡死或运行太久,可以生成 KILL 语句来终止它们:
-- 生成杀死执行时间超过 60 秒的会话的 SQL 语句
SELECT
CONCAT('KILL ', ID, ';') AS kill_command
FROM
information_schema.PROCESSLIST
WHERE
COMMAND != 'Sleep'
AND TIME > 60
ORDER BY
TIME DESC;
复制查询结果中的 kill_command 执行即可。
4. 进阶:使用 sys 库查看更详细的统计信息(MySQL 5.7+)
如果你的 MySQL 版本是 5.7 或更高,推荐使用 sys schema,它提供了更易读的视图:
-- 查看当前正在执行的语句及其耗时详情
SELECT
thd_id,
conn_id,
user,
db,
command,
state,
time,
current_statement,
lock_latency
FROM
sys.processlist
WHERE
command != 'Sleep'
ORDER BY
time DESC;
或者查看历史平均执行时间最长的 SQL(不仅仅是当前运行的):
SELECT
query,
exec_count,
total_latency,
avg_latency,
max_latency
FROM
sys.statement_analysis
ORDER BY
avg_latency DESC
LIMIT 10;
注意事项
- 权限要求 :普通用户只能看到自己的进程,需要
PROCESS权限(通常 DBA 拥有)才能看到所有用户的正在运行的 SQL。 - INFO 字段截断 :
information_schema.PROCESSLIST中的INFO字段默认只显示前 1024 个字符。如果需要查看完整 SQL,需查询performance_schema.events_statements_current表(需开启相关性能监控)。