92

当我在 MySQL 数据库中运行 SHOW PROCESSLIST 时,我得到以下输出:

mysql> show full processlist;

+--------+------+-----------+--------+---------+-------+-------+-----------------------+
| Id     | User | Host      | db     | Command | Time  | State | Info                  |
+--------+------+-----------+-------+---------+-------+-------+-----------------------+
| 411665 | root | localhost | somedb | Sleep   | 11388 |       | NULL                  | 
| 412109 | root | localhost | somedb | Query   |     0 | NULL  | show full processlist | 
+--------+------+-----------+-------+---------+-------+-------+------------------------+

我想知道命令下的进程“睡眠”。这是什么意思?为什么它运行了很长时间并显示为NULL?它使数据库变慢,当我终止进程时,它可以正常工作。请帮我。

4

4 回答 4

84

这不是等待连接的查询;这是一个等待超时终止的连接指针。

它对性能没有影响。它唯一使用的是每个连接都使用的几个字节。

最糟糕的情况:它使用了你的池的一个连接;如果您要通过控制台客户端连接多次并关闭客户端而不关闭连接,您可能会用完所有连接并且必须等待超时才能再次连接......但这不太可能:-)

查看充满“睡眠”条目导致“连接过多”的 MySql 进程列表?https://dba.stackexchange.com/questions/1558/how-long-is-too-long-for-mysql-connections-to-sleep了解更多信息。

于 2013-01-04T14:36:00.713 回答
28

“睡眠”状态连接通常由维护与数据库的持久连接的代码创建。

这可能包括由应用程序框架创建的连接池或客户端数据库管理工具。

正如上面评论中提到的,真的没有理由担心这些连接......当然,除非你不知道连接来自哪里。

(警告:如果您有一长串此类连接,则可能存在同时连接用完的危险。)

于 2013-01-03T20:12:15.003 回答
5

我在这里找到了这个答案:https ://dba.stackexchange.com/questions/1558 。简而言之,使用以下(或在 my.cnf 中)将消除超时问题。

SET GLOBAL interactive_timeout = 180; SET GLOBAL wait_timeout = 180;

如果连接保持在睡眠状态 3 分钟(或您定义的任何内容),这将允许连接结束。

于 2018-03-12T11:36:44.767 回答
0

睡眠意味着该线程什么也不做。由于anthor线程查询时间过长,但没有断开服务器,默认wait_timeout=28800;所以你可以设置较小的值,例如10。也可以杀死线程。

于 2013-05-23T03:22:40.357 回答