mysql optimizer_switch : 查詢優化器優化策略深入解析

碼到三十五 : 個人主頁

在 MySQL 數據庫中,查詢優化器是一個至關重要的組件,它負責確定執行 SQL 查詢的最有效方法。為了提供DBA和開發者更多的靈活性和控制權,MySQL 引入了 optimizer_switch 系統變量。這個強大的工具允許用戶開啟或關閉特定的優化策略,從而可以根據具體的工作負載和數據分布調整查詢的執行計劃。

目錄

      • optimizer_switch 的概念
        • 查看當前的優化器標志集
        • 修改optimizer_switch的值
      • 主要優化標志介紹
      • 如何使用 optimizer_switch
      • 注意事項和最佳實踐
      • 結論

optimizer_switch 的概念

optimizer_switch 是一個由多個標志組成的字符串,每個標志控制一個特定的優化器行為。這些標志可以被設置為 onoff,以啟用或禁用相應的優化策略。通過調整這些標志,數據庫管理員可以精細地控制查詢優化器的行為,以達到最佳的性能表現。

ptimizer_switch系統變量可以控制優化器行為。它的值是一組標志,每個標志都有一個on或off值,用于指示相應的優化器行為是啟用還是禁用。此變量具有全局值和會話值,可以在運行時更改。全局默認值可以在服務器啟動時設置。

查看當前的優化器標志集
mysql> SELECT @@optimizer_switch\G
*************************** 1. row ***************************
@@optimizer_switch: index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on,subquery_to_derived=off,prefer_ordering_index=on,hypergraph_optimizer=off,derived_condition_pushdown=on
1 row in set (0.00 sec)
修改optimizer_switch的值

要修改optimizer_switch的值,指定一個由一個或多個命令組成的逗號分隔的值:

SET [GLOBAL|SESSION] optimizer_switch='command[,command]...';

每個命令值應該具有下表所示的形式之一:
在這里插入圖片描述

該值中命令的順序并不重要,但如果存在,默認命令將首先執行。將opt_name標志設置為default將其設置為on或off中的任意一個為其默認值。不允許在值中多次指定任何給定的opt_name,這會導致錯誤。該值中的任何錯誤都會導致賦值失敗,并導致optimizer_switch的值保持不變。

主要優化標志介紹

  1. index_merge

    index_merge 控制是否允許索引合并優化。當查詢條件可以通過多個索引來滿足時,MySQL 可以合并這些索引以更有效地檢索數據。在復雜查詢中,這可以顯著提高性能。

  2. index_condition_pushdown (ICP)

    ICP 允許將 WHERE 子句中的條件推送到存儲引擎層進行處理。這減少了存儲引擎需要返回給優化器的數據量,因為它可以在檢索數據時就過濾掉不符合條件的行。

  3. materialization

    當查詢包含子查詢時,materialization 標志控制是否將子查詢的結果物化(即臨時存儲)。物化子查詢可以減少重復計算,但也可能增加內存使用。

  4. semijoinloosescan

    這兩個標志與半連接優化相關。半連接是一種在處理包含 EXISTS 或 IN 子句的查詢時特別有效的優化策略。semijoin 控制是否使用這種優化,而 loosescan 則允許在某些情況下進行更高效的掃描。

  5. derived_merge

    當查詢中包含派生表(由子查詢生成的臨時表)時,derived_merge 標志控制是否嘗試將這些派生表合并到外部查詢中。這可以減少查詢的復雜性并提高性能。

  6. exists_to_in

    在某些情況下,將 EXISTS 子句轉換為 IN 子句可能會改變查詢的執行計劃并提高性能。exists_to_in 標志控制是否進行這種轉換。

  7. mrr (Multi-Range Read)

    MRR 是一種優化技術,用于改善范圍查詢和JOIN操作的性能。當設置為on時,MySQL 會嘗試使用 MRR 來更有效地從磁盤讀取數據。這通常可以減少磁盤I/O,并提高查詢速度。

  8. mrr_cost_based

    當此標志設置為on時,MySQL 將基于成本決定是否使用 MRR。如果查詢優化器認為使用 MRR 會更有效,那么它就會使用這種技術。否則,它將回退到傳統的讀取方法。

  9. block_nested_loop

    這個標志控制是否使用塊嵌套循環連接(Block Nested Loop Join, BNLJ)。BNLJ 是一種在處理連接操作時減少I/O次數的方法。當設置為on時,MySQL 將考慮使用 BNLJ 來優化連接操作。

  10. batched_key_access

當此標志啟用時,MySQL 會嘗試使用批處理鍵訪問(Batched Key Access, BKA)來優化某些類型的 JOIN 操作。BKA 可以減少在 JOIN 操作中訪問索引的次數,從而提高性能。

  1. use_index_extensions

這個標志允許優化器使用索引擴展來優化某些類型的查詢。索引擴展是一種技術,其中優化器可以使用索引中的額外信息來過濾結果集,而無需回表查找數據行。

  1. condition_fanout_filter

當此標志設置為on時,優化器將嘗試使用條件扇出過濾器(Condition Fanout Filter, CFF)來優化查詢。CFF 是一種在處理具有多個可能值的列時減少不必要行掃描的技術。

  1. use_invisible_indexes

這個標志控制優化器是否考慮使用標記為“不可見”的索引。在某些情況下,數據庫管理員可能希望將索引標記為不可見以進行測試或維護,而不影響現有查詢的性能。當此標志設置為on時,即使索引被標記為不可見,優化器也會考慮使用它們。

  1. skip_scan

skip_scan 允許優化器在某些情況下使用跳躍掃描來優化范圍查詢。跳躍掃描是一種技術,其中優化器可以跳過某些索引條目以更快地找到滿足查詢條件的條目。

  1. duplicateweedout

在執行某些類型的 JOIN 操作時,可能會出現重復的行。當 duplicateweedout 設置為on時,優化器將嘗試在結果集中刪除這些重復的行,從而提高查詢結果的準確性。

  1. subquery_materialization_cost_based

    當此標志設置為on時,優化器將基于成本決定是否物化子查詢。物化子查詢是將子查詢的結果集存儲在臨時表中,以便在外部查詢中重復使用。這可以提高某些類型查詢的性能,但也可能增加內存使用。

如何使用 optimizer_switch

要使用 optimizer_switch,你首先需要查看其當前設置:

SHOW VARIABLES LIKE 'optimizer_switch';

這將返回一個包含所有當前設置的標志及其狀態的列表。

要更改設置,你可以使用 SET 語句。例如,要啟用 ICP,你可以執行:

SET optimizer_switch='index_condition_pushdown=on';

注意,上述命令只會更改當前會話的設置。如果你想全局更改設置,需要使用 GLOBAL 關鍵字:

SET GLOBAL optimizer_switch='index_condition_pushdown=on';

注意事項和最佳實踐

  • 在更改 optimizer_switch 設置之前,最好先在測試環境中驗證更改的效果。
  • 不是所有的優化標志都適用于所有版本的 MySQL。在更改設置之前,請查閱相關文檔以確保你了解每個標志的具體行為和限制。
  • 避免在生產環境中盲目更改設置。應該基于實際的性能分析和測試來做出決策。
  • 監控數據庫的性能指標,以便及時發現并解決潛在問題。

結論

optimizer_switch 是一個強大的工具,允許數據庫管理員和開發者精細地控制 MySQL 查詢優化器的行為。合理地調整這些設置,可以提高數據庫的性能并優化查詢效率。使用時也要謹慎并基于充分的測試和分析。


聽說...關注下面公眾號的人都變牛了,純技術,純干貨 !

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24070.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24070.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24070.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nginx配置WebSocket參數wss連接

目錄 一、原文連接 二、 配置參數 三、實踐 四、重啟nginx 五、連接websocket 一、原文連接 nginx配置websocket支持wss-騰訊云開發者社區-騰訊云 二、 配置參數 map $http_upgrade $connection_upgrade { default upgrade; close; } upstream websocket { se…

聚類的外部指標(Purity, ARI, NMI, ACC) 和內部指標(NCC,Entropy,Compactness,Silhouette Index)

在聚類分析中,外部指標和內部指標用于評估聚類結果的質量。外部指標需要知道真實的類別標簽,而內部指標則僅基于聚類結果本身進行評估。 外部指標 Purity (純度): 計算聚類結果中每個簇中最多數目的樣本所屬的類別,并計算所有簇的該類別樣本數之和占所有樣本數的比例。 Pyt…

【操作系統】進程與線程的區別及總結(非常非常重要,面試必考題,其它文章可以不看,但這篇文章最后的總結你必須要看,滿滿的全是干貨......)

目錄 一、 進程1.1 PID(進程標識符)1.2 內存指針1.3 文件描述符表1.4 狀態1.5 優先級1.6 記賬信息1.7 上下文 二、線程三、總結:進程和線程之間的區別(非常非常非常重要,面試必考題) 一、 進程 簡單來介紹一下什么是進程&#xf…

win 系統 cmd 命令從私庫上傳,下載jar包

1. 確保maven環境變量或者maven安裝無誤&#xff1b; 2.私庫下載 命令 mvn dependency:get -DgroupId<your_group_id> -DartifactId<your_artifact_id> -Dversion<your_version> -Dpackagingjar -Dfile<path_to_your_jar_file> -Durl<your_privat…

寫入文件內容

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在實例01中&#xff0c;雖然創建并打開一個文件&#xff0c;但是該文件中并沒有任何內容&#xff0c;它的大小是0KB。Python的文件對象提供了write()…

【電路筆記】-分貝

分貝 分貝是以 10 為底的對數比,用于表示電路中功率、電壓或電流的增加或減少。 1、概述 一般來說,分貝是響度的度量。 在設計或使用放大器和濾波器電路時,計算中使用的一些數字可能非常大或非常小。 例如,如果我們將兩個放大器級級聯在一起,功率或電壓增益分別為 20 和…

os和os.path模塊

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 目錄也稱文件夾&#xff0c;用于分層保存文件。通過目錄可以分門別類地存放文件。我們也可以通過目錄快速找到想要的文件。在Python中&#xff0c;并…

033.搜索旋轉排序數組

題意 整數數組 nums 按升序排列&#xff0c;數組中的值 互不相同 。 在傳遞給方法之前&#xff0c;nums 在預先未知的某個下標 k(0 < k < nums.length)上進行了旋轉&#xff0c;使數組變為 [nums[k], nums[k1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]&…

古字畫3d立體在線數字展覽館更高效便捷

在數字時代的浪潮中&#xff0c;大連圖書館以嶄新的面貌躍然屏幕之上——3D全景圖書館。這座承載著城市文化精髓與豐富知識資源的數字圖書館&#xff0c;利用前沿的三維建模技術&#xff0c;為我們呈現了一個全新的知識世界。 隨時隨地&#xff0c;無論您身處何地&#xff0c;只…

獲得抖音商品評論 API 返回值

公共參數 名稱類型必須描述keyString是調用key&#xff08;獲取key和密鑰???????&#xff09;secretString是調用密鑰api_nameString是API接口名稱&#xff08;包括在請求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes,no]默認yes&am…

信息學奧賽初賽天天練-22-C++基礎關鍵字、進制轉換、結構體與聯合體的實用技巧大揭秘

PDF文檔公眾號回復關鍵字:20240607 單項選擇題&#xff08;共15題&#xff0c;每題2分&#xff0c;共計30分&#xff1a;每題有且僅有一個正確選項&#xff09; 1 在C中&#xff0c;下面哪個關鍵字用于聲明一個變量&#xff0c;其值不能被修改&#xff1f;&#xff08; &#…

二叉樹講解升級版

目錄 二叉樹的存儲結構 二叉樹結點的查找和修改 二叉樹結點的插入 二叉樹的創建 二叉樹的遍歷 先序遍歷 中序遍歷 后序遍歷 層序遍歷 重建二叉樹 二叉樹的靜態實現 二叉樹的存儲結構 一般來說&#xff0c;二叉樹使用鏈表來定義。和普通鏈表的區別是&#xff0c;由于…

【Java】解決Java報錯:StackOverflowError

文章目錄 引言1. 錯誤詳解2. 常見的出錯場景2.1 無限遞歸2.2 遞歸深度過大2.3 方法調用層次過深 3. 解決方案3.1 優化遞歸算法3.2 尾遞歸優化3.3 增加調用棧大小3.4 檢查遞歸終止條件 4. 預防措施4.1 使用迭代替代遞歸4.2 尾遞歸優化4.3 合理設計遞歸算法4.4 調整JVM參數4.5 定…

b端系統類管理平臺設計前端開發案例

b端系統類管理平臺設計前端開發案例

二叉樹-堆的詳解

一&#xff0c;樹的概念 1&#xff0c;樹的概念 樹是一種非線性的數據結構&#xff0c;它是由n&#xff08;n>0&#xff09;個有限結點組成一個具有層次關系的集合。 把它叫做樹是因為它看起來像一棵倒掛的樹&#xff0c;也就是說它是根朝上&#xff0c;而葉朝下的。 有…

vue3 + echarts 二次開發百分比餅圖

效果圖&#xff1a; 安裝 pnpm i echarts 公共模塊組件 <divclass"pie"ref"percent"style"width: 100%; height: calc(100% - 48px)"></div> import { ref, onMounted } from vue import * as echarts from echarts const prop…

【JavaScript腳本宇宙】解密前端工具:選擇最佳JavaScript模塊管理工具

精選前端工具匯總&#xff1a;打包器和捆綁器的完整指南 前言 在現代Web開發中&#xff0c;使用適當的工具和庫可以極大地提高開發效率和項目質量。本文將介紹一些常用的Web應用程序捆綁器&#xff0c;這些工具能夠幫助開發人員有效地管理JavaScript模塊和資源。 歡迎訂閱專欄…

SpringBoot項目啟動提示端口號占用

Windows環境下&#xff0c;SpringBoot項目啟動時報端口號占用&#xff1a; *************************** APPLICATION FAILED TO START ***************************Description:Web server failed to start. Port 8080 was already in use.Action:Identify and stop the proc…

【樂吾樂3D可視化組態編輯器】狀態告警示例

狀態告警的設置方法為兩種&#xff1a; 1.通過數據點號設置&#xff08;推薦&#xff09;&#xff1a; 適用于綁定單一數據點號&#xff0c;設置邏輯簡潔&#xff0c;實現簡單邏輯交互 2.通過交互事件監聽數據點號設置&#xff1a; 適用于綁定多個數據點號&#xff0c;實現復…

LLM大模型AI應用的三階技術

第一階 指令工程&#xff08;Prompt Enginner&#xff09; 設計提示&#xff08;Prompt Design&#xff09; 結果優化&#xff08;Response Optimization&#xff09; 交互設計&#xff08;Interaction Design&#xff09; 模型理解&#xff08;Model Understanding&#…