【MySQL精通之路】查詢優化器的使用(8)

MySQL通過影響查詢計劃評估方式的系統變量可切換優化優化器索引提示以及優化器成本模型提供優化器控制。

服務器在column_statistics數據字典表中維護有關列值的直方圖統計信息(請參閱第10.9.6節“Optimizer統計信息”)。與其他數據字典表一樣,用戶無法直接訪問此表。相反,您可以通過查詢information_SCHEMA來獲取直方圖信息。COLUMN_STATISTICS,它被實現為數據字典表上的視圖。您還可以使用ANALYZE TABLE語句執行直方圖管理。

1.控制查詢計劃評估

????????查詢優化器的任務是找到執行SQL查詢的最佳計劃。由于“好”和“壞”計劃之間的性能差異可能是幾個數量級(即秒與小時甚至天),因此大多數查詢優化器,包括MySQL的查詢優化器,都會在所有可能的查詢評估計劃中或多或少地搜索最優計劃

????????對于聯接查詢,MySQL優化器調查的可能計劃的數量隨著查詢中引用的表的數量呈指數級增長。對于少量的表(通常少于7到10個),這不是問題。然而,當提交更大的查詢時,用于查詢優化的時間很容易成為服務器性能的主要瓶頸

????????一種更靈活的查詢優化方法使用戶能夠控制優化器在搜索最佳查詢評估計劃時的詳盡程度。一般的想法是,優化器調查的計劃越少,編譯查詢所花費的時間就越少。另一方面,由于優化器跳過了一些計劃,它可能無法找到最佳計劃。

優化器相對于其評估的計劃數量的行為可以使用兩個系統變量進行控制:

optimizer_prune_level變量告訴優化器根據每個表訪問的行數估計跳過某些計劃。

我們的經驗表明,這種“有根據的猜測”很少會錯過最佳計劃,并可能大大減少查詢編譯時間。這就是為什么默認情況下此選項處于啟用狀態(optimizer_prune_level=1)。

但是,如果您認為優化器錯過了更好的查詢計劃,則可以關閉此選項(optimizer_prune_level=0),這樣可能會導致查詢編譯耗時更長。

請注意,即使使用了這種啟發式方法,優化器仍然會探索大致指數數量的計劃

optimizer_search_depth變量告訴優化器應該在每個不完整計劃的“未來”中將查看的深度,以評估是否應該進一步擴展。

optimizer_search_depth的值越小,查詢編譯時間就越小。

例如,如果optimizer_search_depth接近查詢中的表數,則具有12個、13個或更多表的查詢

可能很容易需要數小時甚至數天才能編譯

同時,如果使用等于3或4的optimizer_search_depth進行編譯,則優化器可以在不到一分鐘的時間內對同一查詢進行編譯。

如果您不確定optimizer_search_depth的合理值是多少,可以將該變量設置為0,以告訴優化器自動確定該值。

2.可切換優化

優化器開關系統變量可以控制優化器的行為。

它的值是一組標志,每個標志的值為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的值,請指定一個由一個或多個命令的逗號分隔列表組成的值:

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

每個命令值都應具有下表所示的其中一種形式。

命令意義
default將每個優化重置為其默認值
opt_name=default將命名優化設置為其默認值
opt_name=off禁用命名優化
opt_name=on啟用命名優化

值中命令的順序無關緊要,盡管默認命令會首先執行(如果存在)。

將opt_name標志設置為default會將其設置為on或off中的默認值。

不允許在值中多次指定任何給定的opt_name,這會導致錯誤。

值中的任何錯誤都會導致賦值失敗并出現錯誤,使優化器開關的值保持不變。


以下列表描述了按優化策略分組的允許的opt_name標志名稱:

2.1 批處理密鑰訪問標志

batched_key_access(默認關閉)

控制BKA聯接算法的使用。

batched_key_access在設置為on時要有任何效果,mrr標志也必須為on。

目前,mrr的成本估計過于悲觀。因此,也有必要關閉mrr_cost_based以使用BKA

有關更多信息,請參閱“塊嵌套循環和批處理Key訪問連接”。

【MySQL精通之路】SQL優化(1)-查詢優化(12)-塊嵌套循環和批處理Key訪問聯接-CSDN博客

2.2 塊嵌套循環標志

block_nested_roop(默認啟用)

控制BNL聯接算法的使用。

在MySQL 8.0.18及更高版本中,這也控制了散列聯接的使用,BNLNO_BNL優化器提示也是如此。

在MySQL 8.0.20及更高版本中,從MySQL服務器中刪除了塊嵌套循環支持,該標志僅控制散列聯接的使用,引用的優化器提示也是如此。

有關更多信息,請參閱“塊嵌套循環和批處理Key訪問連接”。

【MySQL精通之路】SQL優化(1)-查詢優化(12)-塊嵌套循環和批處理Key訪問聯接-CSDN博客

2.3 條件篩選標志

condition-fanout-filter(默認打開)

控制條件篩選的使用。

【MySQL精通之路】SQL優化(1)-查詢優化(13)-條件過濾-CSDN博客

未完待續。。。

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

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

相關文章

#Ethereum 現貨ETF 問題匯總 轉

專題: #Ethereum 現貨ETF 問題匯總,包括了多數小伙伴們的疑問,有任何忽略請留言給我,我會補充。 1. #ETH 現貨ETF何時公布? 一般來說會在北京時間的5月24日凌晨2點至4點之間,不排除稍微延后到凌晨6點的可能…

基于大語言模型的應用

在AI領域,大語言模型已成為備受矚目的焦點,尤其在自然語言處理(NLP)領域,其應用愈發廣泛。BLM作為一種多任務語言建模方法,旨在構建一個具備多功能的強大模型。在給定文本和查詢條件下,該模型能…

【深度學習】YOLOv8訓練,交通燈目標檢測

文章目錄 一、數據處理二、環境三、訓練 一、數據處理 import traceback import xml.etree.ElementTree as ET import os import shutil import random import cv2 import numpy as np from tqdm import tqdmdef convert_annotation_to_list(xml_filepath, size_width, size_he…

海山數據庫(He3DB)代理ProxySQL使用詳解:(二)功能實測

讀寫分離實測 ProxySQL官方demo演示了三種讀寫分離的方式:使用不同的端口進行讀寫分離、使用正則表達式進行通用的讀寫分離、使用正則和digest進行更智能的讀寫分離。最后一種是針對特定業務進行的優化調整,也可將其歸結為第二種方式,下邊分…

MySQL備份與日志練習

1、創建對mysql數據庫test1的定時備份任務,頻率是每周一的2點 create database test1;crond -e0 2 * * 1 mysqldump -u root -pAdmin123 --databases test1 > /opt/test1.sql2、test1中有t1、t2、t3三張表,要求只備份t2這張表 mysqldump -u root -pA…

Python 機器學習 基礎 之 數據表示與特征工程 【單變量非線性變換 / 自動化特征選擇/利用專家知識】的簡單說明

Python 機器學習 基礎 之 數據表示與特征工程 【單變量非線性變換 / 自動化特征選擇/利用專家知識】的簡單說明 目錄 Python 機器學習 基礎 之 數據表示與特征工程 【單變量非線性變換 / 自動化特征選擇/利用專家知識】的簡單說明 一、簡單介紹 二、單變量非線性變換 三、自…

知識圖譜數據預處理筆記

知識圖譜數據預處理筆記 0. 引言1. 筆記1-1. \的轉義1-2. 特殊符號的清理1-3. 檢查結尾是否正常1-4. 檢查<>是否存在1-5. 兩端空格的清理1-6. 檢查object內容長時是否以<開始 0. 引言 最近學習知識圖譜&#xff0c;發現數據有很多問題&#xff0c;這篇筆記記錄遇到的…

軟件設計師備考筆記(九):數據庫技術基礎

文章目錄 一、基本概念二、數據模型&#xff08;一&#xff09;基本概念&#xff08;二&#xff09;E-R模型&#xff08;三&#xff09;數據模型 三、關系代數&#xff08;一&#xff09;關系數據庫的基本概念&#xff08;二&#xff09;五種基本的關系代數運算&#xff08;三&…

React hooks - forwardRef+useImperativeHandle

forwardRefuseImperativeHandle React.forwardRef用法useImperativeHandle用法第三個參數的用法 React.forwardRef與useImperativeHandle配合使用注意事項 React.forwardRef用法 1.創建一個 能夠接受到ref屬性的React 組件。 ref 用來獲取實例&#xff0c;但函數組件不存在實例…

bugku 網絡安全事件應急響應

開啟靶場&#xff1a; 開始實驗&#xff1a; 使用Xshell登錄服務器&#xff0c;賬號及密碼如上圖。 1、提交攻擊者的IP地址 WP: 找到服務器日志路徑&#xff0c;通常是在/var/log/&#xff0c;使用cd /var/log/&#xff0c;ls查看此路徑下的文件. 找到nginx文件夾。 進入ng…

hyperopt、optuna、gridsearch、randomsearch自動調參

開始使?hyperopt進??動調參 algo partial(tpe.suggest, n_startup_jobs1) best fmin(lightgbm_factory, space, algoalgo, max_evals20, pass_expr_memo_ctrlNone) RMSE lightgbm_factory(best) print(‘best :’, best) print(‘best param after transform :’) argsD…

【Jenkins】Centos7安裝Jenkins(環境:JDK11,tomcat9,maven3.8)

目錄 Jenkins部署環境Maven安裝1.上傳安裝包2.解壓3.配置Maven環境變量4.使配置文件立即生效5.校驗Maven安裝6.Maven配置阿里云倉庫7.Maven配置依賴下載位置 Git安裝安裝監測安裝 JDK17安裝1.查看舊版本JDK2.卸載舊版本JDK3.查看是否卸載干凈4.創建java目錄5.下載JDK11安裝包6.…

“開源與閉源大模型:數據隱私、商業應用與社區參與的多維比較“

開源大模型和閉源大模型各有其優勢和局限&#xff0c;它們在數據隱私、商業應用和社區參與方面的表現也各有不同。以下是對這三個方面進行的分析&#xff1a; 方向一&#xff1a;數據隱私 開源大模型&#xff1a; 優點&#xff1a;開源模型通常允許用戶和開發者查看和修改代…

Excel中Lookup函數

#Excel查找函數最常用的是Vlookup&#xff0c;而且是經常用其精確查找。Lookup函數的強大之處在于其“二分法”的原理。 LOOKUP&#xff08;查找值&#xff0c;查找區域&#xff08;Vector/Array&#xff09;&#xff0c;[返回結果區域]&#xff09; 為什么查找區域必須升序/…

一種處理checked exception的方法

一種處理checked exception的方法 在網上看到的一種處理異常的方法 public abstract class Try<V> {private Try() {}public abstract Boolean isSuccess();public abstract Boolean isFailure();public abstract void throwException();public abstract Throwable getMe…

【UE HTTP】“BlueprintHTTP Server - A Web Server for Unreal Engine”插件使用記錄

1. 在商城中下載“BlueprintHTTP Server - A Web Server for Unreal Engine”插件 該插件的主要功能有如下3點&#xff1a; &#xff08;1&#xff09;監聽客戶端請求。 &#xff08;2&#xff09;可以將文件直接從Unreal Engine應用程序提供到Web。 &#xff08;3&#xff…

Antd Vue項目引入TailwindCss之后出現svg icon下移,布局中的問題解決方案

目錄 1. 現象&#xff1a; 2. 原因分析&#xff1a; 3. 解決方案&#xff1a; 寫法一&#xff1a;擴展Preflight 寫法二&#xff1a; 4. 禁用 Preflight 1. 現象&#xff1a; Antd Vue項目引入TailwindCss之后出現svg icon下移&#xff0c;不能對齊顯示的情況&#xff0…

k8s筆記 | Prometheus安裝

kube-prometheus 基于github安裝 選擇對應的版本 這里選擇 https://github.com/prometheus-operator/kube-prometheus/tree/release-0.11 下載修改為國內鏡像源 image: quay.io 改為 quay.mirrors.ustc.edu.cn image: k8s.gcr.io 改為 lank8s.cn 創建 prometheus-ingres…

在AndroidStudio創建虛擬手機DUB-AI20

1.DUB-AI20介紹 DUB-AL20是華為暢享9全網通機型。 華為暢享9采用基于Android 8.1定制的EMUI 8.2系統&#xff0c;最大的亮點是配置了1300萬AI雙攝、4000mAh大電池以及AI人臉識別功能&#xff0c;支持熄屏快拍、笑臉抓拍、聲控拍照、手勢拍照等特色的拍照功能&#xff0c;支持移…

Windows安裝mingw32/w64

1.下載 MinGW-w64 WinLibs - GCCMinGW-w64 compiler for Windows Releases niXman/mingw-builds-binaries (github.com) MinGW-w64、UCRT 和 MSVCRT 是 Windows 平臺上常用的 C/C 運行庫&#xff0c;它們有以下不同點&#xff1a; MinGW-w64&#xff1a;是一個基于 GCC 的…