为 MySQL 查询分配超时期限

为 MySQL 查询分配超时期限

有没有办法为 MySQL 查询分配超时时间,并将其限制为 60 秒?我知道使用脚本语言(例如 PHP)时可以做到这一点。但是是否可以直接在 MySQL 中设置配置以防止长时间运行的查询(在我的情况下通常是选择)占用服务器?

注意:运行 Mandriva,数据库位于 MyISAM 中,并且仅用于 SELECT 查询。

答案1

如果复制/从属不是一种选择,并且您试图避免长时间运行的报告查询,那么我通常会采取一种解决方案;

  • 评估哪些运行缓慢的 SELECT 查询被重复执行
  • 将 SELECT 语句转换为报告表:CREATE TABLE report AS SELECT...
  • 并使用 CRON 作业和 SELECT 语句每晚或在任何情况下填写报告表。

在这种情况下,您的老板将能够更快地在新报告表中获取数据。您可能已经想出了一个很好的解决方案,但这仍然很有用。:)

答案2

一个简单的解决方案是使用 Percona Toolkit 的pt-kill选项。它有多个选项,并且被多个人使用。

我建议使用从属服务器,但它需要额外的资源(服务器/实例)。通过这种方法,您的生产服务器将被隔离,即使您的老板写了最糟糕的查询,也不会对业务造成损害。

答案3

根据您对查询类型的回复,我可以说以下内容:

如果你的老板只执行 select 语句,你可以考虑安装并运行mysql 复制并授予他访问从属数据库服务器的权限。这样,如果他输入了非常复杂且耗时的查询,您的生产(主)服务器就不会受到影响。

答案4

默认情况下不是,不是。

然而 Twitter 团队已经发布了他们的 MySQL 工作,它完全实现了这一点(来自http://engineering.twitter.com/2012/04/mysql-at-twitter.html):

- Reduce unnecessary work through improved server-side statement timeout support. This allows the server to proactively cancel queries that run longer than a millisecond-granularity timeout.

https://github.com/twitter/mysql/wiki/Statement-Timeouthttps://github.com/twitter/mysql

一个更简单的解决方案是每 X 分钟运行一次 cronjob,搜索你老板的查询,如果查询运行时间超过 Y 秒,则终止它们。

相关内容