MySQL的max_execution_time不能在my.cnf中配置生效,它仅对SELECT语句有效,且必须通过SET GLOBAL(影响新连接默认值)或SET SESSION(当前会话生效)显式设置,客户端仍可覆盖;全局配置被静默忽略。

不能靠配置文件全局设一个参数就一劳永逸地限制所有 SQL 执行时间。 max_execution_time 只对 SELECT 生效,且必须显式设置到会话或语句级才起作用;my.cnf 里写 max_execution_time 是无效的——MySQL 不支持该变量在配置文件中持久化生效。
为什么 SET GLOBAL max_execution_time 在 my.cnf 里不生效
MySQL 官方明确说明:max_execution_time 是只读的动态变量,不能写入 my.cnf / my.ini 配置文件。你如果在 [mysqld] 段里加了 max_execution_time = 5000,MySQL 启动时会静默忽略这行,SHOW VARIABLES LIKE 'max_execution_time' 仍显示 0。
- 它只能通过
SET GLOBAL max_execution_time = N动态设置(需 SUPER 权限) - 但该设置仅影响后续新建的连接,已有连接不受影响
- 更重要的是:GLOBAL 值只是“新连接的默认值”,不是强制策略——客户端连上来后完全可以立刻执行
SET SESSION max_execution_time = 0关掉限制
真正能落地的会话级设置方式
应用每次建连后,必须主动执行初始化语句,否则限制形同虚设:
- 推荐在连接池(如 HikariCP、Druid)的
connection-init-sql中配置:SET SESSION max_execution_time = 5000 - PHP 的 PDO 需在
PDO::ATTR_INIT_COMMAND中设置;mysqli 则需在mysqli_real_connect()后立即调用mysqli_query($conn, "SET SESSION max_execution_time = 5000") - 注意:某些旧版 JDBC 驱动(如 mysql-connector-java Query execution was interrupted 错误,会卡住而非抛异常
单条 SELECT 的精准控制:用 MAX_EXECUTION_TIME hint
这是唯一不依赖会话状态、也不受用户/连接干扰的方式,适用于高危查询或临时压测:
- 写法必须严格:
SELECT /*+ MAX_EXECUTION_TIME(2000) */ * FROM t WHERE ...—— 注释和SELECT之间不能换行,/*+和MAX_EXECUTION_TIME之间不能有空格 - 优先级最高:即使会话已设 10 秒,hint 写了 2 秒,就按 2 秒中断
- 只作用于最外层
SELECT,子查询、UNION 中的 SELECT 不受控 - 错误码固定为:
ERROR 3024 (HY000): Query execution was interrupted, maximum statement execution time exceeded
最容易被忽略的点是:超时只发生在执行器扫描行时,锁等待、解析、优化、网络传输都不计时。一个等了 8 秒行锁的 SELECT,哪怕只扫 1 行就返回,max_execution_time 也完全没机会触发。


















