Mysql(MariaDB)wait_timeout是否排除查询执行时间



我正在调整我的项目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就可以处理来自用户的请求,而无需打开连接的开销。

以下是它的工作原理。

  1. php坐在那里监听传入的请求
  2. 一个请求到达,php脚本开始运行
  3. php脚本要求数据库连接
  4. php(mysqli或PDO模块)查看它是否有空闲连接在连接池中等待。如果是这样,它会将连接传递给要使用的php脚本
  5. 如果没有空闲连接,php会创建一个连接,并将其传递给php脚本使用。此连接创建开始wait_timeout倒计时
  6. php脚本使用该连接进行查询。这将停止wait_timeout倒计时,并开始max_execution_time倒计时
  7. 查询完成。这将停止max_execution_time倒计时并重新开始wait_timeout倒计时。根据需要经常重复6和7
  8. php脚本释放连接,php将其插入到连接池中。返回步骤1。wait_time在池中时正在为该连接倒计时
  9. 如果连接的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分钟也不无道理。要自由,避免"不良反馈"。

最新更新