2

首先,我知道我运行查询的方式存在根本问题。我想忽略这个问题的根本原因,在这个问题中只问以下问题:

我有一个在 Lambda (Larval Vapor) 上运行的 PHP 脚本。运行一批插入、更新和删除查询时,lambda 函数在 60 秒时超时,但是在 MySQL 进程列表中,我看到这些查询在之后运行了很长时间(数十分钟)。

如果 PHP 脚本超时,这些查询来自哪里?我的猜测是它们被存储在查询缓存中,但我只是在猜测。我很想知道更多关于它是如何工作的。

我目前遇到的问题是 php 脚本超时,因此我的应用程序认为它失败了。在稍后的函数中,我们再次运行相同的查询,但当然它们仍在 RDS 实例上运行。因此,我们最终只是将相同的查询叠加在一起——PHP 不知道 SQL 服务器有任何查询正在运行......

4

2 回答 2

2

SHOW PROCESSLIST 不显示查询缓存。查询缓存不存储查询,它存储查询结果。即,数据。

您在 SHOW PROCESSLIST 中看到的是正在运行的查询。当客户端连接时,MySQL 服务器在服务器中创建一个线程。这就是为该连接执行每个查询的原因。当客户端关闭时,服务器中的线程终止。

如果您的 Lambda 脚本异常终止,例如由于 AWS 时间限制,MySQL 服务器可能不会立即意识到客户端已经离开,因此服务器允许查询继续运行直到完成。但是不会有客户端来获取结果。最终,服务器将使该线程超时并终止它。

如果您使用 Lambda,则必须特别注意确保您的查询得到很好的优化,并且运行时间不会超过 Lambda 执行时间限制,如果我记得是 5 分钟。

如果您的查询运行时间超过 5 分钟,则不适合在 Lambda 中运行。


回复您的评论:

如果 SQL 查询以低效的方式扫描大量数据,它很容易运行 30 分钟或更长时间。有时 SQL 查询效率非常低,很难在30 分钟内运行!

MySQL 确实具有在时间限制后终止查询的功能,但我认为这是错误的解决方案。如果你强制服务器限制查询的时间,这并不意味着你在更短的时间内得到结果,这意味着查询被取消了,你没有得到任何结果。同样,如果它是 UPDATE,您不会等待一组行作为结果,但它仍然会被取消。换句话说,您想要的 UPDATE 不会发生。

更好的解决方案是优化查询,因此它通常运行得足够快,可以在您希望它超时之前为您提供结果。

于 2020-02-04T14:47:49.063 回答
0

我猜想由于 php 超时,与 MySQL 服务器的连接没有正确关闭,数据库服务器现在不应该中断正在运行的查询的执行。

于 2020-02-04T14:30:49.387 回答