有没有办法为 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-Timeout和https://github.com/twitter/mysql。
一个更简单的解决方案是每 X 分钟运行一次 cronjob,搜索你老板的查询,如果查询运行时间超过 Y 秒,则终止它们。