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](