信息表 PROCESSLIST
在 MySQL 5.1 和 5.5 中,无法使用上述解决方案。
相反,使用信息架构中的 PROCESSLIST 表。
查询 PROCESSLIST 表等效于执行 SHOW PROCESSLIST,区别在于我们可以指定 WHERE 子句。
Information Schema PROCESSLIST 表(和 SHOW PROCESSLIST)需要一个可以影响服务器性能的互斥锁。
因此,建议在 MySQL 5.6 及更高版本中使用上述基于 Performance Schema 的方法之一,并避免频繁查询 PROCESSLIST 表或者 SHOW PROCESSLIST。
例如:
mysql> SELECT * FROM information_schema.PROCESSLIST WHERE Command = 'Query' AND TIME > 10; +----+------+-----------+------+---------+------+---------------------------+-------------------------------------------------+ | ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO | +----+------+-----------+------+---------+------+---------------------------+-------------------------------------------------+ | 11 | root | localhost | db1 | Query | 24 | Searching rows for update | UPDATE MegaCity SET Population = Population + 1 | +----+------+-----------+------+---------+------+---------------------------+-------------------------------------------------+ 1 row in set (0.00 sec)
问题
Mysql如何查找需要超过给定时间才能完成的查询?
解决方案
查找长时间运行的查询的最简单方法是查看进程列表。
根据版本以及我们是否安装了 Sys Schema,有多种关于如何执行此操作的选项。
本文中的示例都将查找耗时超过 10 秒的查询。
根据需要更改持续时间。
Sys Schema 会话视图
在安装了 Sys Schema 的 MySQL 5.6 或者更高版本中,我们可以使用会话视图,例如:
mysql> SELECT * FROM sys.session WHERE command = 'Query' AND time > 10\G
*** 1. row ***
thd_id: 36
conn_id: 11
user: root@localhost
db: db1
command: Query
state: copy to tmp table
time: 244
current_statement: ALTER TABLE MegaCity ENGINE=InnoDB
statement_latency: 4.06 m
progress: 52.73
lock_latency: 21.55 ms
rows_examined: 0
rows_sent: 0
rows_affected: 0
tmp_tables: 0
tmp_disk_tables: 0
full_scan: NO
last_statement: NULL
last_statement_latency: NULL
current_memory: 296.29 KiB
last_wait: NULL
last_wait_latency: NULL
source: NULL
trx_latency: NULL
trx_state: NULL
trx_autocommit: NULL
pid: 11884
program_name: mysql
1 row in set (0.08 sec)
会话视图与 sys.processlist 视图相同,不同之处在于会话视图不包括后台线程。
会话视图优于下面描述的方法的一个优点是它将包括内存使用情况和进度信息(如果可用)。
例如在上面的输出中,查询估计已经完成了 52.73% 的工作,并且当前使用了 296.29 KiB 的内存。
进度估计和内存使用情况都不准确。
特别是内存使用取决于启用的 Performance Schema 工具和代码中工具的覆盖范围。
进度信息可用于帮助确定是应终止还是允许完成查询。
Performance Schema 线程表
在 MySQL 5.6 及更高版本中,建议使用 performance_schema.threads 表而不是 SHOW PROCESSLIST 或者 information_schema.PROCESSLIST 因为使用线程表对正在运行的查询影响较小。
上面讨论的 Sys Schema 视图 processlist 和 session 建立在线程表的顶部。
要获得长时间运行的查询,我们可以使用:
mysql> SELECT PROCESSLIST_ID, PROCESSLIST_USER, PROCESSLIST_HOST, PROCESSLIST_DB, PROCESSLIST_COMMAND, PROCESSLIST_TIME, PROCESSLIST_STATE, PROCESSLIST_INFO FROM performance_schema.threads WHERE PROCESSLIST_COMMAND = 'Query' AND PROCESSLIST_TIME > 10; +----------------+------------------+------------------+----------------+---------------------+------------------+---------------------------+-------------------------------------------------+ | PROCESSLIST_ID | PROCESSLIST_USER | PROCESSLIST_HOST | PROCESSLIST_DB | PROCESSLIST_COMMAND | PROCESSLIST_TIME | PROCESSLIST_STATE | PROCESSLIST_INFO | +----------------+------------------+------------------+----------------+---------------------+------------------+---------------------------+-------------------------------------------------+ | 11 | root | localhost | db1 | Query | 49 | Searching rows for update | UPDATE MegaCity SET Population = Population + 1 | +----------------+------------------+------------------+----------------+---------------------+------------------+---------------------------+-------------------------------------------------+ 1 row in set (0.00 sec)
