MySQL 查询正在执行的 SQL
在 MySQL 数据库中,我们经常需要了解正在执行的 SQL 查询语句,以便进行性能优化或排查问题。本文将介绍多种方法来查询正在执行的 SQL。
方法一:查询 information_schema
数据库
在 MySQL 中,可以通过查询 information_schema
数据库的 PROCESSLIST
表来获取当前正在执行的 SQL 查询语句。
SELECT * FROM information_schema.PROCESSLIST;
这将返回一个包含所有正在执行的 SQL 的结果集,其中包括查询的 ID、用户、主机、状态和 SQL 查询语句等信息。可以根据需要对结果进行过滤和排序。
ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO |
---|---|---|---|---|---|---|---|
1 | user | 127.0.0.1:1 | test_db | Query | 5 | Running | SELECT * FROM test_table WHERE id = 10 |
2 | user | 127.0.0.1:2 | test_db | Sleep | |||
3 | user | 127.0.0.1:3 | test_db | Query | 10 | Locked | UPDATE test_table SET name = 'John' |
在上面的示例中,我们可以看到第一行正在执行的 SQL 查询是 SELECT * FROM test_table WHERE id = 10
。
方法二:使用 SHOW FULL PROCESSLIST
另一种查询正在执行的 SQL 的方法是使用 SHOW FULL PROCESSLIST
命令。这将返回一个类似于 PROCESSLIST
表的结果集,但只包含正在执行的查询。
SHOW FULL PROCESSLIST;
Id | User | Host | db | Command | Time | State | Info |
---|---|---|---|---|---|---|---|
1 | user | 127.0.0.1:1 | test_db | Query | 5 | Running | SELECT * FROM test_table WHERE id = 10 |
3 | user | 127.0.0.1:3 | test_db | Query | 10 | Locked | UPDATE test_table SET name = 'John' |
在这个例子中,我们可以看到第一行和第三行是正在执行的 SQL 查询语句。
方法三:使用 SHOW ENGINE INNODB STATUS
如果使用的是 InnoDB 存储引擎,可以使用 SHOW ENGINE INNODB STATUS
命令来查看当前正在执行的 SQL 查询。
SHOW ENGINE INNODB STATUS;
命令的输出是一个包含大量信息的长文本。我们需要查找 "LATEST DETECTED DEADLOCK" 和 "TRANSACTIONS" 两个标签下的信息。
------------------------
LATEST DETECTED DEADLOCK
------------------------
...
------------------------
TRANSACTIONS
------------------------
...
在 "TRANSACTIONS" 标签下,可以找到 ACTIVE
状态的事务,其中包含了正在执行的 SQL 查询。
方法四:使用 pt-kill
pt-kill
是 Percona Toolkit 中的一个工具,可以根据各种条件来终止或报告执行时间过长的查询。
pt-kill --busy-time 5 --interval 1
上述示例中,--busy-time 5
表示终止执行时间超过 5 秒的查询,--interval 1
表示每秒检查一次。
通过 pt-kill
可以及时终止执行时间过长的查询,保证数据库的性能。
结语
本文介绍了四种查询正在执行的 SQL 的方法,包括使用 information_schema
数据库、SHOW FULL PROCESSLIST
命令、SHOW ENGINE INNODB STATUS
命令和 pt-kill
工具。根据实际需求,选择合适的方法来查询正在执行的 SQL,有助于性能优化和问题排查。
希望本文对你理解和查询正在执行的 SQL 查询有所帮助。
【参考文献】
- [MySQL :: MySQL 5.7 Reference Manual :: 23.18 Performance Schema Thread Table](
- [MySQL :: MySQL 5.7 Reference Manual :: 23.2 The INFORMATION_SCHEMA PROCESSLIST Table](