首页 > 数据库 >MySQL的系统变量max_execution_time小结

MySQL的系统变量max_execution_time小结

时间:2024-05-28 11:12:48浏览次数:11  
标签:max time mysql MySQL execution SELECT

参数介绍:

MySQL社区版MySQL 5.7.8开始,新增了MAX_EXECUTION_TIME这个系统变量,它用来限制SQL语句的执行时间,确切来说是限制只读SELECT语句。如果查询语句的执行时长超过这个阈值,MySQL将自动停止该SQL语句的执行。如果其值为 0,表示不启用该超时限制功能。该参数/变量单位是毫秒(milliseconds),千万要注意,单位是毫秒。不是秒。

官方文档[1]关于系统变量max_execution_time的描述如下:

The execution timeout for SELECT statements, in milliseconds. If the value is 0, timeouts are not enabled.

max_execution_time applies as follows:

The global max_execution_time value provides the default for the session value for new connections. The session value applies to SELECT executions executed within the session that include no MAX_EXECUTION_TIME(N) optimizer hint or for which N is 0.

max_execution_time applies to read-only SELECT statements. Statements that are not read only are those that invoke a stored function that modifies data as a side effect.

max_execution_time is ignored for SELECT statements in stored programs.or SELECT statements in stored programs.

注意事项:

  1. max_execution_time只对只读的select有效,对DDL及UPDATE、DELETE等DML操作不生效
  2. 只有顶层(即不是子查询)SQL受到影响
  3. 存储程序中的 SELECT 语句,不受影响。即使存储过程中SELECT语句使用MAX_EXECUTION_TIME提示也不受影响

生产环境较常见的情况是,由于没有正确配置JDBC等驱动,导致业务代码已经超时退出了与数据库的交互,但是数据库里依旧运行着发起的SQL,如果频繁发起重试,则慢SQL会越来越多,导致数据库负载高,影响稳定性及可用性。因此,建议设置参数max_execution_time来解决这种情况。但是,由于生产环境的复杂性,需要跟开发人员先协商,另外,这个值可能需要设置的相对大一些,避免影响业务。总之来说是谨慎使用。

其实在MySQL 5.6的时候,其他分支版本(从所查资料来看,最开始是twitter的分支版本[2]引入的,也被Percona Server 5.6分支版本并入)引入了系统变量max_statement_time来控制MySQL的最长执行时间。如果超过该系统变量的值,查询将会自动失败,默认是不限制。

不过MySQL社区版在MySQL 5.6并未引入这个系统变量,从社区版MySQL 5.7.4开始,才开始引入了系统变量max_statement_time。不过这个系统变量在MySQL 5.7.8被移除。具体可以参考官方文档[3]。其实这个系统变量之所以在MySQL 5.7.8被移除,是因为用系统变量max_execution_time替换了系统变量max_statement_time

  • max_statement_time: Statement execution timeout value. Added in MySQL 5.7.4.
  • max_statement_time: Statement execution timeout value. Removed in MySQL 5.7.8.

参数设置

全局级别

方法1.在参数文件my.cnf中设置

max_execution_time=20000

注意:这种方法,需要重启MySQL数据库实例才能生效。

方法2:

mysql> set global max_execution_time=20000;
Query OK, 0 rows affected (0.00 sec)

注意,设置全局系统变量后,对当前会话不生效,正确来说已经建立连接的会话是不生效的,它只对全局系统变量设置后,新建立的会话生效。如下所示,另外,重启后会系统变量值会失效。

mysql> show variables like 'max_execution_time';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_execution_time | 0     |
+--------------------+-------+
1 row in set (0.00 sec)

mysql> 
mysql> select  @@global.max_execution_time, @@session.max_execution_time;

如果想重启后也能生效,可以使用下面SQL设置

mysql> set persist max_execution_time=20000;
Query OK, 0 rows affected (0.01 sec)

会话级别

mysql> set max_execution_time=1000;
Query OK, 0 rows affected (0.00 sec)

SQL语句级别

其实这里使用HINT来限制SELECT查询的最大时长,也的确是在语句级别执行限制。

SELECT /*+ MAX_EXECUTION_TIME(3000) */ * FROM table_name;

上述SQL语句表示,执行该查询,并设置执行时间为3秒,在超时时间到达时,MySQL将自动停止该查询的执行。注意:该选项只在使用InnoDB的默认存储引擎时有效,如果需要在其他存储引擎中使用该选项,请自行查阅文档或手册。

mysql>  SELECT /*+ MAX_EXECUTION_TIME(2000) */ * FROM TEST;
ERROR 3024 (HY000): Query execution was interrupted, maximum statement execution time exceeded
mysql> 

参考资料

[1]

1: https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_max_execution_time

[2]

2: https://github.com/twitter-forks/mysql/wiki/Statement-Timeout

[3]

3: https://dev.mysql.com/doc/refman/5.7/en/added-deprecated-removed.html

标签:max,time,mysql,MySQL,execution,SELECT
From: https://www.cnblogs.com/kerrycode/p/18217492

相关文章

  • MySQL - [08] 存储过程
    题记部分  一、什么是存储过程  存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。  存储过程思想上很简单,就是数据库SQL语言层面的......
  • MySQL数据库语法(五-->多表查询)
    多表查询1.innerjoin:代表选择的是两个表的交差部分。内连接就是表间的主键与外键相连,只取得键值一致的,可以获取双方表中的数据连接方式。语法如下:SELECT列名1,列名2...FROM表1INNERJOIN表2ON表1.外键=表2.主键WhERE条件语句;2.leftjoin:代表选择的是前面......
  • Mysql单表普通查询(新手推荐)
    大家在学校里学mysql查询的时候,尤其是遇到比较复杂查询的时候,不知道有没有经常遇到问题。小编在学习mysql的时候,经常哪个怎么搞,得出的值也老是不对,今天在这里分享一些原理性的东西,帮助大家理解如何去查询基础 3、select...聚合函数from表名1、where.........
  • MySQL中如何快速定位占用CPU过高的SQL
    作为DBA工作中都会遇到过数据库服务器CPU飙升的场景,我们该如何快速定位问题?又该如何快速找到具体是哪个SQL引发的CPU异常呢?下面我们说两个方法。聊聊MySQL中如何快速定位占用CPU过高的SQL。技术人人都可以磨炼,但处理问题的思路和角度各有不同,希望这篇文章可以抛砖引玉。 以一......
  • mysql存储地理信息的方法
    MySQL存储地理信息通常使用GEOMETRY数据类型或其子类型(如POINT,LINESTRING,POLYGON等)。为了支持这些数据类型,MySQL提供了SPATIAL索引,这允许我们执行高效的地理空间查询。1.创建支持地理信息的表首先,我们需要一个包含GEOMETRY或其子类型列的表。以下是一个示例,展示......
  • 数据库初始,SQL语句介绍,MySQL数据库安装,SQL语句基础,操作MySQL数据库
    Ⅰ数据库初识【一】存储数据的演变过程【1】文件基于内存保存在早期,随意地存放到一个文件中、数据格式也是千差万别的,完全取决于个人员工管理系统是基于列表或字典(内存)存储数据【2】文件操作用本地的文本文件存储数据有的人喜欢存储到本地的一个文件中有的人喜欢存......
  • 成为MySQL DBA后,再看ORACLE数据库(二、监听与连接)
    一、监听器的启动ORACLE启动完成后,可以通过sqlplus/assysdba连接数据库,但是这个只是本地连接,无法通过tcp/ip远程访问数据库,这时候就要启动ORAClE的监听器。启动监听器的命令是lsnrctlstart,启动成功后,可以观察到1521端口也随之监听,这时候就能通过ip加端口远程访问数据库了。在......
  • 在运行Yolov8时报错RuntimeError: torch.cat(): expected a non-empty list of Tensor
    这个错误还算是比较冷门当是又不是太容易发现,在报错出来的时候容易被最后面的提醒误解,我的报错提示如下:RuntimeErrorTraceback(mostrecentcalllast)InputIn[11],in<module>6model=YOLO('./yolov8.yaml').load('./yolov8n.pt......
  • OpenQA.Selenium.WebDriverException The HTTP request to the remote WebDriver serv
    OpenQA.Selenium.WebDriverException:“TheHTTPrequesttotheremoteWebDriverserverforURLhttp://localhost:xxxx/sessiontimedoutafter60seconds.”1.在谷歌浏览器上加上中括号中的内容[--remote-debugging-port=9222]2.使用管理员模式打开谷歌浏览器3.重新生成......
  • mysql 8.0.18的docker安装
    1.拉取镜像sudodockerpullmysql:8.0.182.运行dockersudodockerrun-p3306:3306--namemysql--restart=always--privileged=true\-v/home/cy/soft/mysql/conf/mysql/log:/var/log/mysql\-v/home/cy/soft/mysql/data:/var/lib/mysql\-v/home/cy/soft/mysql/conf/......