MySQL篇—執行計劃介紹(第二篇,總共三篇)

??博主介紹??

?又是一天沒白過,我是奈斯,DBA一名?

???擅長Oracle、MySQL、SQLserver、Linux,也在積極的擴展IT方向的其他知識面???

??????大佬們都喜歡靜靜的看文章,并且也會默默的點贊收藏加關注??????

? ? 士別三日,自上次分享以來,大家應該對上篇的文章內容進行了深入消化與理解。今天給大家帶來第二篇的內容——執行計劃。在上篇文章中我們有了解到optimizer優化器根據統計信息對每個sql語句執行最優的執行計劃(執行計劃受統計信息影響)。并且通過執行計劃能夠幫助我們了解數據庫在執行查詢時采用的具體策略、使用的索引以及各種操作的執行順序等信息,因此對于SQL查詢的優化非常重要。

? ? 因為統計信息和執行計劃涉及到的內容過多,為了使大家更好消化,我將分成三篇文章來進行介紹,以便大家因為篇幅過長而感到閱讀疲憊。三篇的內容分別如下,讓大家先做了解:

第一篇:持久化和非持久化統計信息介紹

第二篇:執行計劃介紹(當前篇)

第三篇:執行計劃之覆蓋索引Using index和條件過濾Using where詳細介紹


目錄

查看SQL的執行計劃

explain語法一:explain + SQL語句(默認FORMAT = TRADITIONAL輸出格式為表格)

explain語法二:explain FORMAT = JSON + SQL語句

explain語法三:explain FORMAT = TREE + SQL語句

explain語法四:explain analyze + SQL語句


廢話不多說,讓我們開始今天的內容。

? ??MySQL中的SQL執行計劃能夠幫助我們了解數據庫在執行查詢時采用的具體策略、使用的索引以及各種操作的執行順序等信息,因此對于SQL查詢的優化非常重要。下面是SQL執行計劃在SQL查詢優化中的作用:

1)評估查詢性能:SQL 執行計劃可以讓我們了解到 MySQL 在執行查詢時所采用的具體策略和每個步驟所需的時間,從而評估查詢的性能表現。比如,我們可以查看每個操作使用的索引類型或臨時表的創建情況,有助于我們確定查詢是否需要進行優化,以及應該優化哪些部分。

2)定位性能問題:如果SQL查詢執行緩慢,我們可以通過 SQL 執行計劃來定位性能問題所在。例如,我們可以查看查詢語句中是否存在不必要的排序、全表掃描、臨時表創建等問題,從而確定性能瓶頸并進行調整。

3)判斷索引是否有效:SQL 執行計劃可以讓我們了解到 MySQL 是否使用了正確的索引來執行查詢,進而判斷我們為表設置的索引是否有效。如果 MySQL 沒有使用索引,那么可能是我們設置的索引有問題,需要重新考慮索引的創建方式。

4)選擇正確的查詢方案:在SQL查詢優化中,有時候我們需要選擇不同的查詢方案來完成同樣的查詢操作。SQL 執行計劃可以讓我們了解到MySQL計劃使用哪種查詢方案,并可以根據不同的情況調整查詢方案或者SQL語句結構。

總之,SQL 執行計劃是 SQL 查詢優化的重要工具,可以幫助我們找到問題所在,優化查詢性能并提高數據庫的運行效率。

? ? ? ? ? ? ??

查看SQL的執行計劃

? ? 通過explain查看執行計劃的方式有多種,今天主要是詳細介紹語法一,其他的方式我這里不多做介紹,因為都是大同小異,有興趣的小伙伴可以私信我。

EXPLAIN語法:

官方文檔對EXPLAIN的介紹:MySQL :: MySQL 8.0 Reference Manual :: 15.8.2 EXPLAIN Statement

{EXPLAIN | DESCRIBE | DESC}

????tbl_name [col_name | wild]

{EXPLAIN | DESCRIBE | DESC}

????[explain_type]

????{explainable_stmt | FOR CONNECTION connection_id}

{EXPLAIN | DESCRIBE | DESC} ANALYZE [FORMAT = TREE] select_statement

explain_type: {

????FORMAT = format_name

}

format_name: {

??| TRADITIONAL

??| JSON

??| TREE

}

explainable_stmt: {

??| SELECT statement

??| TABLE statement

??| DELETE statement

??| INSERT statement

??| REPLACE statement

??| UPDATE statement

}

EXPLAIN [options]?FOR CONNECTION connection_id:獲取在命名連接中執行的可解釋語句的執行計劃。意思就是在另一個會話上去查看其他會話正在執行SQL的執行計劃,通常的做法是在另一個會話上輸入show porcesslist(或者其他查詢SQL的語句),有正在執行的SQL那么通過EXPLAIN [options]?FOR CONNECTION加上show processlist輸出的ID,那么可以看到相關SQL的執行計劃。

FORMAT = format_name:選項可用于選擇輸出格式。默認以表格格式顯示輸出(FORMAT = TRADITIONAL)。可以指定其他輸出格式,JSON格式以JSON格式顯示信息(FORMAT = JSON)。在MySQL 8.0.16及更高版本中,TREE提供了樹狀輸出(FORMAT = TREE),比傳統格式更精確地描述了查詢處理,并且它是唯一顯示哈希連接用法的格式,和EXPLAIN ANALYZE輸出的內容大致相同。在MySQL 8.0.32中添加的explain_format系統變量在用于獲取表列信息時,影響對explain的輸出,參數的值包括TRADITIONAL (DEFAULT)、JSON、TREE。

explainable_stmt:EXPLAIN適用于SELECT、DELETE、INSERT、REPLACE和UPDATE語句的執行計劃的解析。在MySQL 8.0.19及更高版本中,它還可以使用TABLE語句,TABLE語句是MySQL 8.0.19中引入的DML語句,它返回指定表的行和列,和SELECT查詢表有些類似,但功能又沒SELECT多。

注意:SQL語句加上explain不會真正執行SQL語句,它僅會模擬MySQL在執行該語句時所做的操作,并返回MySQL在執行該語句時使用的查詢計劃信息。

? ? ? ? ? ??

explain語法一:explain + SQL語句(默認FORMAT = TRADITIONAL輸出格式為表格)

mysql> explain select * from tb t1 join tb2 t2 on t1.id=t2.id;

需要特別關注的字段type、possible_keys、key、key_len、ref、rows、Extra。官方文檔解釋輸出列:MySQL :: MySQL 8.0 Reference Manual :: 10.8.2 EXPLAIN Output Format

id(JSON名稱:select_id):SELECT標識符。這是查詢中SELECT的序列號。如果該行引用其他行的并集結果,則該值可以為NULL。在這種情況下,表列顯示一個類似于<union M,N>的值,表示該行指的是id值為M和N的行的并集。

select_type(JSON名稱:無):SELECT的類型JSON格式的EXPLAIN將SELECT類型公開為query_block的屬性,除非它是SIMPLE或PRIMARY。類型比較多,參考官方文檔。

table(JSON名稱:table_name)輸出行所引用的表的名稱。

partitions(JSON名稱:partitions查詢將從中匹配記錄的分區。對于未分區的表該值為NULL。

type(JSON名稱:access_type)聯接類型。類型比較多,參考官方文檔。

possible_keys(JSON名稱:possible_ keys):possible_keys列表示MySQL可以從中選擇查找該表中的行的索引。請注意,此列完全獨立于EXPLAIN輸出中顯示的表的順序。這意味著possible_keys中的一些鍵在實際中可能無法使用生成的表順序。如果此列為NULL(或在JSON格式的輸出中未定義),則不存在相關索引。在這種情況下,您可以通過檢查WHERE子句來檢查它是否引用了適合進行索引的一個或多個列,從而提高查詢的性能。如果是,請創建一個適當的索引ALTER TABLE語句,并再次使用EXPLAIN檢查查詢。要查看表的索引,請使用SHOW INDEX FROM tbl_name。

keyJSON名稱key):這key列表示MySQL實際決定使用的鍵(索引)。如果MySQL決定使用possible_keys索引來查找行,該索引被列為鍵值。有可能key可以命名一個不在possible_keys價值。如果沒有一個possible_keys索引適合于查找行,但是查詢選擇的所有列都是其他索引的列。也就是說,命名索引覆蓋了所選的列,因此盡管它不用于確定要檢索哪些行,但索引掃描比數據行掃描更有效。

為InnoDB,即使查詢也選擇了主鍵,輔助索引也可能會覆蓋選定的列,因為InnoDB存儲每個輔助索引的主鍵值。如果key是NULL,MySQL找不到索引來更有效地執行查詢。要強制MySQL使用或忽略possible_keys列,使用FORCE INDEX, USE INDEX,或者IGNORE INDEX在您的查詢中。看見第8.9.4節,“索引提示”.

為MyISAM表格,運行ANALYZE TABLE幫助優化器選擇更好的索引。為MyISAM表格,myisamchk -分析做同樣的事。看見13.7.3.1,“分析表語句”一節,以及第7.6節,“MyISAM表維護和故障恢復”.

key_len(JSON名稱:key_length):key_len列表示MySQL決定使用的密鑰的長度。key_len的值使您能夠確定MySQL實際使用多部分密鑰的多少部分。如果key列表示NULL,那么key_len列也表示NULL。由于密鑰存儲格式的原因,可以為NULL的列的密鑰長度比NOT NULL列的密鑰長一個。

ref(JSON名稱:ref):ref列顯示將哪些列或常量與鍵列中命名的索引進行比較,以便從表中選擇行。如果該值是func,則使用的值是某個函數的結果。要查看哪個函數,請在EXPLAIN后面使用SHOW WARNINGS來查看擴展的EXPLAIN輸出。函數實際上可能是一個運算符,例如算術運算符。

rows(JSON名稱:rowsrows列表示MySQL認為執行查詢必須檢查的行數。這里的行數和自動更新持久化統計信息是一致的,所以會出現與實際count(*)數據量差距較大,可以這個文檔的2、統計信息的案例“(6)解決統計信息差別較大的問題(執行計劃受統計信息影響,統計信息不準會導致執行計劃不準)”

filtered(JSON名稱:filtered)已篩選列表示按表條件篩選的表行的估計百分比。最大值為100,這意味著沒有對行進行篩選。從100開始遞減的值表示過濾量的增加。rows顯示檢查的估計行數,rows×filtered顯示與下表連接的行數。例如,如果行數為1000,過濾后的行數為50.00(50%),則與下表連接的行數是1000×50%=500。

Extra(JSON名稱:無):本列包含有關MySQL如何解析查詢的其他信息沒有一個JSON屬性對應于Extra列;但是,此列中可能出現的值將作為JSON屬性或消息屬性的文本公開。類型比較多,參考官方文檔。

? ? ? ? ? ? ? ? ??

explain語法二:explain FORMAT = JSON + SQL語句

mysql> explain FORMAT = JSON select * from tb t1 join tb2 t2 on t1.id=t2.id\G;

? ? ? ? ? ??

explain語法三:explain FORMAT = TREE + SQL語句

mysql> explain FORMAT = TREE select * from tb t1 join tb2 t2 on t1.id=t2.id\G;

? ? ? ? ? ? ? ?

explain語法四:explain analyze + SQL語句

mysql> explain analyze select * from tb t1 join tb2 t2 on t1.id=t2.id\G;

? ? 今天執行計劃的內容就介紹到這里,只是對執行計劃輸出的內容做了介紹,下一篇我會用實例執行的執行計劃的案例來介紹。

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

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

相關文章

Python 編輯工具 Jupyter notebook

Jupyter notebook Jupyter Notebook是基于網頁的用于交互計算的應用程序。其可被應用于全過程計算:開發、文檔編寫、運行代碼和展示結果。——Jupyter Notebook官方介紹 官網:Project Jupyter | Home Jupyter Notebook 是一個開源的交互式計算環境&#…

dockerdocker-copose_限制容器cpu和內存

本文目錄 docker的限制方式限制CPU占用限制內存占用 docker-compose docker的限制方式 限制CPU占用 Docker使用--cpus參數來限制容器的CPU資源。該參數指定了分配給容器的CPU核心數量或百分比。 例子&#xff1a;限制CPU使用個數 docker run --cpus2 <imageName>以上…

網頁版圖像處理軟件開發服務:助您項目在市場競爭中脫穎而出

在當今數字化時代&#xff0c;圖像處理在各個行業中扮演著重要的角色&#xff0c;虎克專注于提供定制化的網頁版圖像處理軟件開發服務&#xff0c;為您的項目保駕護航。 1.網頁版圖像處理軟件的定制化需求 1.1行業特定功能 針對不同的業務需求&#xff0c;深入了解行業特點&…

springboot基于web的酒店客房管理系統論文

基于web的酒店客房管理系統 摘要 隨著信息技術在管理上越來越深入而廣泛的應用&#xff0c;管理信息系統的實施在技術上已逐步成熟。本文介紹了酒店客房管理系統的開發全過程。通過分析酒店客房管理系統管理的不足&#xff0c;創建了一個計算機管理酒店客房管理系統的方案。文…

Redis 之八:Jdeis API 的使用(Java 操作 Redis)

Jedis API 使用 Jedis 是 Redis 官方推薦的 Java 客戶端&#xff0c;它提供了一套豐富的 API 來操作 Redis 服務器。通過 Jedis API&#xff0c;開發者可以方便地在 Java 應用程序中執行 Redis 的命令來實現數據的增刪查改以及各種復雜的數據結構操作。 以下是一些基本的 Jedis…

springboot網站開發-idea開發環境下無法開啟調試Debug模式

springboot網站開發-idea開發環境下無法開啟調試Debug模式的解決辦法。 近期在寫后端代碼的時候&#xff0c;發現&#xff0c;無法開啟調試模式。網上查詢了一下資料&#xff0c;發現需要做如下修改即可開啟調試模式。 如圖所示&#xff0c;把里面的選項&#xff0c;都放棄勾選…

SQLPro Studio:數據庫管理的革命性工具 mac版

SQLPro Studio是一款強大的數據庫管理和開發工具&#xff0c;它旨在提供高效、便捷和安全的數據庫操作體驗。無論是數據庫管理員、開發人員還是數據分析師&#xff0c;SQLPro Studio都能滿足他們在數據庫管理、查詢、設計和維護方面的需求。 SQLPro Studio mac版軟件獲取 首先…

B樹系列(詳解)

目錄 一、B-樹 二、B樹 三、B*樹 四、時間復雜度 五、Mysql與B樹系列 一、B-樹 首先再說B樹的性質以及其他的之前&#xff0c;先要說一聲&#xff0c;好多人都把這個樹叫B減樹&#xff0c;其實不是&#xff0c;他就叫B樹&#xff0c;至于原因我覺的沒必要再這個名字上糾結…

docker 轉為docker-compose(composerize 命令)

可以使用Composerize將Docker命令轉換為Docker Compose文件。 例如&#xff1a;將docker run命令轉換為Docker Compose格式&#xff0c;只需用Composerize運行它&#xff0c;如下所示&#xff1a; composerize docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/…

【JavaSE】異常

異常概述 異常指的是程序在執行的過程中&#xff0c;出現的非正常情況&#xff0c;如果不處理最終會導致JVM的非正常停止。 在Java中&#xff0c;使用不同的類來表示不同的異常&#xff08;正所謂萬物皆對象&#xff0c;因此異常也使用類來表示&#xff09;。一旦程序出現某種…

【HTML】HTML基礎5(特殊字符)

目錄 特殊字符的作用 常用的特殊字符 使用效果 特殊字符的作用 例如 當我在兩個文字間打出空格時 <p>“銀河護衛隊”系列 在漫威電影宇宙中一直是異數般的存在&#xff0c;不僅因為影片主角是一群反英雄&#xff0c;<strong>與超級英雄相比顯得格格不入<…

讀書筆記-三國演義-三英戰呂布

三英戰呂布是《三國演義》中的一段著名戰役&#xff0c;張飛、關羽和劉備三兄弟聯手擊敗了當時的霸主呂布&#xff0c;展現了他們的武藝和忠義。 介紹 "三英戰呂布"是《三國演義》中的一個著名戰役&#xff0c;發生在三國時期&#xff0c;講述了三位蜀漢名將——劉…

LeetCode 刷題 [C++] 第347題.前 K 個高頻元素

題目描述 給你一個整數數組 nums 和一個整數 k &#xff0c;請你返回其中出現頻率前 k 高的元素。你可以按 任意順序 返回答案。 題目分析 據題意可知&#xff0c;我們需要先遍歷整個數組&#xff0c;并統計每個數字出現的次數&#xff0c;保存在哈希表中&#xff1b;對元素…

synchrosized 的可重入特性、死鎖、哲學家就餐問題以及解決死鎖的方法等干貨

文章目錄 &#x1f490;synchrosized的可重入特性關于死鎖&#xff1a;哲學家就餐問題&#x1f4a1;如何避免/解決死鎖 &#x1f490;synchrosized的可重入特性 可重入特性&#xff1a;當一個線程針對一個對象同時加鎖多次&#xff0c;不會構成死鎖&#xff0c;這樣的特性稱為…

前端學習第一天-html基礎

達標要求 網頁的形成過程 常用的瀏覽器及常見的瀏覽器內核 web 標準三層組成 什么是HTML 熟練掌握HTML文檔結構 熟練掌握HTML常用標簽 1. 初識web前端 Web前端是創建Web頁面或App等前端界面呈現給用戶的過程。 Web前端開發是從網頁制作演變而來&#xff0c;早期網站主…

sklearn.preprocessing.RobustScaler(解釋和原理,分位數,四分位差)

提示&#xff1a;sklearn.preprocessing.RobustScaler&#xff08;解釋和原理&#xff0c;分位數&#xff0c;四分位差&#xff09; 文章目錄 [TOC](文章目錄) 一、RobustScaler 是什么&#xff1f;二、代碼1.代碼2.輸出結果 總結 提示&#xff1a;以下是本篇文章正文內容&…

ELK學習

ELK 一、ELK介紹 &#x1f604; “ELK”是三個開源項目的首字母縮寫&#xff0c;這三個項目分別是&#xff1a;Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一個搜索和分析引擎。Logstash 是服務器端數據處理管道&#xff0c;能夠同時從多個來源采集數據&#xff0…

網絡編程(IP、端口、協議、UDP、TCP)【詳解】

目錄 1.什么是網絡編程&#xff1f; 2.基本的通信架構 3.網絡通信三要素 4.UDP通信-快速入門 5.UDP通信-多發多收 6.TCP通信-快速入門 7.TCP通信-多發多收 8.TCP通信-同時接收多個客戶端 9.TCP通信-綜合案例 1.什么是網絡編程&#xff1f; 網絡編程是可以讓設…

Redis的事務

在 Redis 中&#xff0c;事務&#xff08;Transaction&#xff09;是一組命令的集合&#xff0c;可以作為一個單獨的操作來執行&#xff0c;保證這組命令要么全部執行成功&#xff0c;要么全部執行失敗&#xff0c;具有原子性。在 Redis 中&#xff0c;事務是通過 MULTI、EXEC、…

repo介紹和安裝

介紹 https://blog.devwiki.net/2023/11/27/Windows-repo.html 安裝&#xff1a; https://blog.csdn.net/ysy950803/article/details/104188793