MySQL的系統變數max_execution_time小結

来源:https://www.cnblogs.com/kerrycode/p/18217492
-Advertisement-
Play Games

參數介紹: MySQL社區版MySQL 5.7.8開始,新增了MAX_EXECUTION_TIME這個系統變數,它用來限制SQL語句的執行時間,確切來說是限制只讀SELECT語句。如果查詢語句的執行時長超過這個閾值,MySQL將自動停止該SQL語句的執行。如果其值為 0,表示不啟用該超時限制功能。該 ...


參數介紹:

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

掃描上面二維碼關註我 如果你真心覺得文章寫得不錯,而且對你有所幫助,那就不妨幫忙“推薦"一下,您的“推薦”和”打賞“將是我最大的寫作動力! 本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接.
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 exFAT是微軟2006年推出的一種文件系統,距今已快二十年,相比於FAT16和FAT32,exFAT還是算年輕。exFAT一直是微軟的一個專用文件系統,直到2019年微軟發佈它的規範,目前微軟擁有exFAT多個元素的專利,如果產品上使用exFAT,需要微軟授權,否則有可能侵權。 exFAT被 ...
  • 【標題】ODBC驅動類問題定位方法 【需求分類】故障分析 【關鍵字】ODBC 【需求描述】由於我們的ODBC介面目前尚不完善,經常會遇見ODBC介面能力不足導致應用功能無法運行的問題,需要定位手段確定底層是哪個介面報錯 【需求原因分析】方便一線資料庫管理員初步分析故障 【分析方法】 ● 由於我們的O ...
  • 管理維護Oracle資料庫的時候,有時候會碰到用戶(應用程式)遠程連接/訪問資料庫非常慢,甚至連接超時的問題。這裡簡單總結一下遇到這類問題的方法,僅供參考,如有疏漏或不足之處,敬請指正。文中部分內容來自官方文檔Doc ID 1679567.1[1] 遇到這類問題,首先應該檢查/排除網路問題,一般來說 ...
  • 【標題】kettle從DM8的number類型同步到YashanDB的varchar類型,存入是科學計數法形式的數據 【問題分類】數據導入導出 【關鍵字】數據同步,number類型,科學計數法 【問題描述】客戶查詢不到準確數據,只看到科學計數法展示的字元串。number類型存入到Oracle(MyS ...
  • Percona Toolkit 神器全攻略(實用類) Percona Toolkit 神器全攻略系列共八篇,前文回顧: 前文回顧 Percona Toolkit 神器全攻略 全文約定:$為命令提示符、greatsql>為GreatSQL資料庫提示符。在後續閱讀中,依據此約定進行理解與操作 實用類 在 ...
  • MySQL語句優化包括創建合適的索引、使用覆蓋索引、避免不必要的子查詢、通過 EXPLAIN 分析查詢計劃、進行批量操作、減少鎖定範圍、使用預編譯語句和查詢緩存,以顯著提高查詢性能和資料庫運行效率。 ...
  • 恭喜Apache SeaTunnel社區又迎來一位PMC Member@liugddx!在社區持續活躍的兩年間,大家經常看到這位開源愛好者出現在社區的各種活動中,為項目和社區發展添磚加瓦。如今成為項目PMC Member,意味著在社區中的責任更重了,他有什麼感想呢?對於社區未來的發展,他希望從哪些角 ...
  • 轉載自劉茫茫看山 問題背景 某天我們的租戶反饋資料庫連接缺少必要的驅動,我們通過日誌查看確實是缺少部分資料庫的驅動,因為DolphinScheduler預設只帶了Oracle和MySQL的驅動,並且需要將pom文件中的test模式去掉才可以在打包的時候引入。我們的任務量比較大,在3.0存在容錯機制的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...