我正在调整我的项目MYSQL数据库,因为很多人建议我减少
wait_timeout
,但我不清楚,这个会话变量是排除查询执行时间,还是包括它?我将其设置为5秒,考虑到我有时可能会有3-5秒的查询被执行(是的,这很慢,它们很少,但它们仍然存在),所以mysql连接在被mysql关闭之前,PHP脚本至少需要1-2秒的时间。在MySQL文档中,对于它如何开始计算超时以及是否包括执行时间,没有明确的解释。也许你的经验会有所帮助。谢谢
wait_timeout
会话变量是否排除查询执行时间?
是的,它不包括查询时间。
max_execution_time
控制服务器在停止一个长时间运行的查询之前保持活动的时间
你使用php连接池吗?如果是,则5秒是极短的CCD_ 3。让它更长。60秒可能很好。为什么?连接池的全部目的是保持从php到MySQL的一些空闲连接打开,这样php就可以处理来自用户的请求,而无需打开连接的开销。
以下是它的工作原理。
- php坐在那里监听传入的请求
- 一个请求到达,php脚本开始运行
- php脚本要求数据库连接
- php(mysqli或PDO模块)查看它是否有空闲连接在连接池中等待。如果是这样,它会将连接传递给要使用的php脚本
- 如果没有空闲连接,php会创建一个连接,并将其传递给php脚本使用。此连接创建开始
wait_timeout
倒计时 - php脚本使用该连接进行查询。这将停止
wait_timeout
倒计时,并开始max_execution_time
倒计时 - 查询完成。这将停止
max_execution_time
倒计时并重新开始wait_timeout
倒计时。根据需要经常重复6和7 - php脚本释放连接,php将其插入到连接池中。返回步骤1。
wait_time
在池中时正在为该连接倒计时 - 如果连接的
wait_time
过期,php会将其从连接池中删除
如果步骤9经常发生,那么步骤5也必须经常发生,php对请求的响应会更慢。您可以通过增加wait_timeout
来减少步骤9的发生频率。
(注意:这是简化的:在连接池中还提供了最大连接数。)
MySQL还有一个interactive_timeout
变量。它类似于wait_timeout
,但通过mysql
命令行程序用于交互式会话。
当一个网络用户提出一个请求,然后在完成之前放弃它时,会发生什么?例如,用户可能会停止等待报告,然后转到另一个页面。在某些情况下,主机语言处理器检测到用户连接的关闭,终止MySQL查询,并将连接返回到池。在其他情况下,查询完成或达到max_execution_timeout
障碍。然后将连接返回到池。在所有情况下,wait_timeout
倒计时只有在连接打开但没有查询激活时才有效。
MySQL服务器超时可能有多种原因,但最常见的情况是通过关闭的连接将命令发送到MySQL。MySQL服务器可能因为空闲超时而关闭了连接;然而,在大多数情况下,这是由应用程序错误、网络超时问题(在防火墙、路由器等上)或MySQL服务器重新启动引起的。
从文档中可以清楚地看出,它不包括查询执行时间。这基本上是两个活动之间允许的最大空闲时间。若超过该限制,服务器将自动关闭连接。
服务器在非交互连接,然后关闭。
来源https://www.digitalocean.com/community/questions/how-to-set-no-timeout-to-mysql:
- 将wait_timeout配置为稍长于应用程序连接池的预期连接生存期。这是一次很好的安全检查
- 请考虑在线更改等待超时值。这不需要重新启动MySQL,并且可以在运行的服务器中调整等待超时,而不会导致停机。您将发出setglobalwaitimeout=60,并且创建的任何新会话都将继承此值。请确保保留my.cnf中的设置。如果应用程序放弃连接,任何现有的连接都需要达到旧的等待超时值。如果您的报告作业在事务中进行更长的本地处理,则可以考虑在连接时将此类作业issue设置为sessionwait_timeout=3600
参考手册,
服务器在关闭连接之前等待连接变为活动状态的时间(以秒为单位)。
简单来说,你能容忍有人保留你的资源却什么都不做多少秒?在你决定采取哪种行动之前,你的"思考时间"可能经常超过5秒。要自由。对于web应用程序,某些进程运行查询的时间超过5秒,而您导致它们在5秒时终止。默认值为28800秒,这是不合理的。60秒可能是一个合理的时间来期望任何基于网络的过程完成。如果您的应用程序也在传统的工作环境中使用,那么休息15分钟也不无道理。要自由,避免"不良反馈"。