无论如何限制MySQL查询执行时间?

时间:2011-11-24 09:23:16

标签: mysql

嗨,我现在在我的服务器上遇到问题,因为一些MySQL查询需要很长时间才能运行,并占用服务器上的资源。

我已经在优化所有查询以提高性能,但由于我们在使用mysql的服务器上使用了相当数量的第三方应用程序,因此我希望能够采取措施防止未来出现问题。

我需要的是我可以在服务器范围内放置的适用于所有查询的内容,但有可能在每个查询的基础上覆盖一些需要一些时间来运行的更复杂的报告。

我花时间谷歌搜索找到解决方案,但到目前为止没有运气,

感谢您的帮助

4 个答案:

答案 0 :(得分:3)

这是一个纯粹的php解决方案,似乎是迄今为止我找到的最简单的解决方案。

$result = mysql_query("SHOW FULL PROCESSLIST");
while ($row=mysql_fetch_array($result)) 
{
  $process_id = $row["Id"];
  if ($row["Time"] > 200 ) 
  {
    $sql="KILL {$process_id}";
    mysql_query($sql);
  }
}

每60秒从CRON脚本运行一次。

如果有人确实找到了解决此问题的更好方法,请告诉我

答案 1 :(得分:3)

您可以使用以下过程检查运行时间超过300秒的查询。该事件定期运行该过程并终止所有长时间运行的查询。

    CREATE PROCEDURE DBNAME.kill_long_running_queries ()
BEGIN

  DECLARE v_qid BIGINT;
  DECLARE v_finished INT DEFAULT 0;
  DECLARE c_queries CURSOR FOR SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND = 'Query' AND TIME > 300;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;

  OPEN c_queries;

  l_fetch_queries: LOOP
    FETCH c_queries INTO v_qid;
    IF v_qid > 0 THEN
      KILL QUERY v_qid;
    END IF;
    IF v_finished THEN
      LEAVE l_fetch_queries;
    END IF;
  END LOOP l_fetch_queries;
  CLOSE c_queries;

END

CREATE EVENT kill_long_running_queries
ON SCHEDULE EVERY 60 SECOND
DO CALL DBNAME.kill_long_running_queries();

答案 2 :(得分:1)

我可以推荐专为此设计的http://www.percona.com/doc/percona-toolkit/2.1/pt-kill.html。从手册页:

pt-kill - Kill MySQL queries that match certain criteria.

答案 3 :(得分:0)

使用MySQL选项无法做到这一点。 但你仍然可以使用守护程序进程来执行它,因为@rabudde建议。

在这种情况下,如果你终止进程,你将中止事务,它将被回滚。