max_execution_time仅对独立SELECT语句生效,不作用于INSERT/UPDATE/DELETE、存储过程、触发器及复制线程;5.7默认为0且仅会话级,8.0起支持全局持久化与语句级hint;优先级为hint>会话>全局。

max_execution_time 对单用户不起作用,它只按会话生效
很多人以为 SET GLOBAL max_execution_time = 30000 能限制某个 MySQL 用户的所有查询,实际不是。这个变量是「会话级默认值」,不是「用户级策略」——哪怕你给 user_a 创建了新连接,只要连接初始化时没显式 SET SESSION max_execution_time,它就继承 global 值;但 user_b 的连接也可能用同样的 global 值,无法区分。
真正能绑定用户的办法只有两种:
- 在应用层连接池(如 ProxySQL、MaxScale)配置「按用户名注入初始化命令」,比如对 user_report 用户自动执行
SET SESSION max_execution_time = 5000 - 在业务代码里,每次建连后立刻执行
SET SESSION max_execution_time = ...,不能依赖 global - MySQL 8.0.23+ 可用
SET STATEMENT max_execution_time = 1000 FOR SELECT ...,但仅限单条语句,且不改变会话状态
SELECT /*+ MAX_EXECUTION_TIME(N) */ 是最可靠的单语句控制方式
Hint 方式绕过会话变量,直接作用于当前语句,单位毫秒,不受用户、连接、权限影响,适合临时压测或高危查询防护。
- 写法必须严格:
SELECT/*+ MAX_EXECUTION_TIME(3000) */ * FROM t—— 注释和SELECT之间不能换行或空格过多 - 错误码固定为
ERROR 3024 (HY000): Query execution was interrupted, maximum statement execution time exceeded - 它比会话变量优先级更高:即使 session 设置了 10 秒,hint 写了 1 秒,就按 1 秒走
- 不支持嵌套子查询里的 hint,只对外层
SELECT生效
存储过程里的 SELECT 不受 max_execution_time 控制
官方明确说明:max_execution_time 在存储程序(procedure / function / trigger)内部的 SELECT 语句上被忽略。哪怕你在过程开头写了 SET SESSION max_execution_time = 100,里面跑的 SELECT SLEEP(5) 也不会中断。
- 替代方案只有两个:把耗时逻辑拆到应用层做分页/限流;或改用外部监控(如
pt-kill定期查INFORMATION_SCHEMA.PROCESSLIST中Command = 'Query'且Time > 5的线程,再KILL QUERY) - 注意
pt-kill必须有PROCESS权限,且不能杀掉事务中的 DML,否则可能留下半截锁 - 如果过程里调用了修改数据的函数(哪怕只是
INSERT INTO tmp SELECT ...),整个SELECT就算「非只读」,max_execution_time自动失效
别混淆 wait_timeout 和 max_execution_time
wait_timeout 是空闲连接超时,跟查询执行完全无关;max_execution_time 才是真正在跑的 SELECT 的“倒计时”。两者配置位置、生效时机、错误表现全不同。
-
wait_timeout触发时客户端收到ERROR 2013 (HY000): Lost connection to MySQL server during query,但 MySQL 日志里只记Aborted connection,查不到具体哪条 SQL 被断 -
max_execution_time触发时,MySQL 主动报ERROR 3024,且会在慢查询日志中标记Query_time: 3.001234+Rows_examined: 123456,便于归因 - 配置文件里
wait_timeout放[mysqld]段就行;max_execution_time必须也在[mysqld]下,放错段(比如[client])会被静默忽略
MySQL 的查询超时控制本质是「读操作熔断」,不是资源隔离机制。真正卡住数据库的,往往是未提交事务里的大 UPDATE 或长持有锁的 SELECT —— 这些靠 max_execution_time 压根拦不住,得靠应用层分批、加 LIMIT、主动 COMMIT,以及定期查 INFORMATION_SCHEMA.INNODB_TRX。


















