mysql语句执行超时设置

来源:互联网 发布:铁路运输数据 编辑:程序博客网 时间:2024/06/05 23:11

对于 Saas 系统来说,设置语句执行超时时间是必要的,原因有二:
(1)避免一些有性能问题的语句长时间执行占用大量资源,影响其他用户的使用;
(2)避免请求都被中断了服务端还在长时间的执行SQL语句,无谓的消耗资源;

有两种方式来设置执行超时,任选一种:

1. 客户端代码中设置

例如:使用 mysql 的 .net 驱动
MysqlCommand.CommandTimeout = xxx (秒)

驱动的实现原理:

(1)超时时间到时,驱动会另行和 mysql 建立一个连接;
(2)在新建的连接中,执行 kill query id,请求 mysql 把超时的查询给 kill 掉;
(3)mysql 接受到命令后,主动终止语句的执行,但保留链接,终止后向新连接返回成功消息;
(4)新连接收到消息后,关闭自己;
(5)抛出异常:Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

**

2.服务端设置

**
mysql 5.6 及以后,有语句执行超时时间变量,用于在服务端对 select 语句进行超时时间限制;
mysql 5.6 中,名为: max_statement_time (毫秒)
mysql 5.7 以后,改成: max_execution_time (毫秒)

超过这个时间,mysql 就终止 select 语句的执行,客户端抛异常:
1907: Query execution was interrupted, max_execution_time exceeded.

三种设置粒度:

(1)全局设置
SET GLOBAL MAX_EXECUTION_TIME=1000;
(2)对某个session设置
SET SESSION MAX_EXECUTION_TIME=1000;
(3)对某个语句设置
SELECT max_execution_time=1000 SLEEP(10), a.* from test a;

原创粉丝点击