SQL優化之EXPLAIN執行計劃

来源:https://www.cnblogs.com/qian-fen/archive/2023/05/31/17445384.html
-Advertisement-
Play Games

一. EXPLAIN執行計劃分析 EXPLAIN可以幫助開發人員分析SQL問題,EXPLAIN顯示了MySQL如何使用使用SQL執行計劃,可以幫助開發人員寫出更優化的查詢語句。使用方法,在select語句前加上EXPLAIN就可以了。 ...


前言

從今天開始本系列文章就帶各位小伙伴學習資料庫技術。資料庫技術是Java開發中必不可少的一部分知識內容。也是非常重要的技術。本系列教程由淺入深, 全面講解資料庫體系。 非常適合零基礎的小伙伴來學習。


全文大約 【1965】字,不說廢話,只講可以讓你學到技術、明白原理的純乾貨!本文帶有豐富案例及配圖視頻,讓你更好的理解和運用文中的技術概念,並可以給你帶來具有足夠啟迪的思考...

一. EXPLAIN執行計劃分析

EXPLAIN可以幫助開發人員分析SQL問題,EXPLAIN顯示了MySQL如何使用使用SQL執行計劃,可以幫助開發人員寫出更優化的查詢語句。使用方法,在select語句前加上EXPLAIN就可以了。

1. 舉個例子:

下麵是一個最普通的查詢語句,用EXPLAIN進行分析演示。

EXPLAIN SELECT * FROM student;

結果:

image.png

2. 結果的列的說明如下:

id : SELECT識別符。這是SELECT查詢序列號。這個不重要。

select_type: 表示SELECT語句的類型。

  • simple:簡單select(不使用union或子查詢)。
  • primary:最外面的select。
  • union:union中的第二個或後面的select語句。
  • dependent union:union中的第二個或後面的select語句,取決於外面的查詢。
  • union result:union的結果。
  • subquery:子查詢中的第一個select。
  • dependent subquery:子查詢中的第一個select,取決於外面的查詢。
  • derived:導出表的select(from子句的子查詢)。

table: 顯示這查詢的數據是關於哪張表的。

type: 區間索引,這是重要的列,顯示連接使用了何種類型。從最好到最差的連接類型為。

system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般來說,得保證查詢至少達到range級別,最好能達到ref。

  • system:表僅有一行,這是const類型的特列,平時不會出現,這個也可以忽略不計。
  • const:數據表最多只有一個匹配行,因為只匹配一行數據,所以很快。
  • eq_ref:mysql手冊是這樣說的:"對於每個來自於前面的表的行組合,從該表中讀取一行。這可能是最好的聯接類型,除了const類型。它用在一個索引的所有部分被聯接使用並且索引是UNIQUE或PRIMARY KEY"。eq_ref可以用於使用=比較帶索引的列。
  • ref:查詢條件索引既不是UNIQUE也不是PRIMARY KEY的情況。ref可用於=或<或>操作符的帶索引的列。
  • ref_or_null:該聯接類型如同ref,但是添加了MySQL可以專門搜索包含NULL值的行。在解決子查詢中經常使用該聯接類型的優化。
  • index_merge:該聯接類型表示使用了索引合併優化方法。在這種情況下,key列包含了使用的索引的清單,key_len包含了使用的索引的最長的關鍵元素。
  • unique_subquery:該類型替換了下麵形式的IN子查詢的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是一個索引查找函數,可以完全替換子查詢,效率更高。
  • index_subquery:該聯接類型類似於unique_subquery。可以替換IN子查詢,但只適合下列形式的子查詢中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr)
  • range:只檢索給定範圍的行,使用一個索引來選擇行。
  • index:該聯接類型與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因為索引文件通常比數據文件小。
  • ALL:對於每個來自於先前的表的行組合,進行完整的表掃描(性能最差)。

possible_keys: 指出MySQL能使用哪個索引在該表中找到行。如果是空的,沒有相關的索引。這時要提高性能,可通過檢驗WHERE子句,看是否引用某些欄位,或者檢查欄位不是適合索引。

key: 實際使用到的索引。如果為NULL,則沒有使用索引。如果為primary的話,表示使用了主鍵。

key_len: 最長的索引寬度。如果鍵是NULL,長度就是NULL。在不損失精確性的情況下,長度越短越好。

ref: 顯示使用哪個列或常數與key一起從表中選擇行。

rows: 顯示MySQL認為它執行查詢時必須檢查的行數。

Extra: 執行狀態說明,該列包含MySQL解決查詢的詳細信息。

  • Distinct:MySQL發現第1個匹配行後,停止為當前的行組合搜索更多的行。
  • Not exists:MySQL能夠對查詢進行LEFT JOIN優化,發現1個匹配LEFT JOIN標準的行後,不再為前面的的行組合在該表內檢查更多的行。
  • range checked for each record (index map: #):MySQL沒有發現好的可以使用的索引,但發現如果來自前面的表的列值已知,可能部分索引可以使用。
  • Using filesort:MySQL需要額外的一次傳遞,以找出如何按排序順序檢索行。
  • Using index:從只使用索引樹中的信息而不需要進一步搜索讀取實際的行來檢索表中的列信息。
  • Using temporary:為瞭解決查詢,MySQL需要創建一個臨時表來容納結果。
  • Using where:WHERE 子句用於限制哪一個行匹配下一個表或發送到客戶。
  • Using sort_union(...), Using union(...), Using intersect(...):這些函數說明如何為index_merge聯接類型合併索引掃描。
  • Using index for group-by:類似於訪問表的Using index方式,Using index for group-by表示MySQL發現了一個索引,可以用來查 詢GROUP BY或DISTINCT查詢的所有列,而不要額外搜索硬碟訪問實際的表。

二. 結語

最後在這裡對本文核心要點進行總結:

  1. 本節講瞭如何使用EXPLAIN執行計划進行SQL語句分析,判斷SQL語句哪裡慢。
  2. 比較重要的分析欄位有select_type、type、possible_keys、key、ref、rows,這幾列需要熟練掌握。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # 第1章 Kettle概述 ## 1.1 ETL簡介 ETL(Extract-Transform-Load的縮寫,即數據抽取、轉換、裝載的過程),對於企業或行業應用來說,我們經常會遇到各種數據的處理,轉換,遷移,所以瞭解並掌握一種ETL工具的使用,必不可少。 市面上常用的ETL工具有很多,比如Sq ...
  • Apache DolphinScheduler 於近日發佈了 3.0.6 版本,主要針對 3.0.5 重要 bug 進行修複。如果之後沒有發現重大問題,3.0.6 將會是 3.0.x 最後一個版本。 Bug修複 Master 重新連接 zk 後 slot 沒有正常更新 #14014 父工作流失敗時 ...
  • 今天這份資料庫的內容是《讀者》1-200期精華版,共收錄從第一期至第二百期《讀者》中的文章9953篇,並且具備24個分類欄目。具體看截圖: 詳細的分類情況統計:1文苑(1498)、2雜談隨想(574)、3人物(639)、4社會之窗(214)、5在國外(419)、6青年一代(346)、7科海攬勝(99 ...
  • 確定用戶價值是整個[用戶運營](https://www.dtstack.com/easydigit/userinsight?src=szsm)過程中極其重要的一環。傳統的工作流程中,業務人員向數據部門提出數據需求,等待返回結果後再進行價值分析是主要的準備工作,但這個過程非常耗時。為了提高[工作效率] ...
  • 作文類的資料庫雖然已經有很多,有近萬條的,也有2萬條的,但今天弄到了小學、中學、高中一個系列的數據,而且最主要的是數據的記錄數很多。這份小學作文包含97444條記錄,分類也很好。 grade欄位統計:一年級(8098)、二年級(12869)、三年級(14715)、四年級(13318)、五年級(185 ...
  • 在Oracle 12c/19c多租戶環境中,預設情況下,使用startup命令啟動資料庫實例後,你會發現PDB資料庫的狀態為MOUNT狀態,PDB不會隨著CDB啟動而啟動。如下例子所示: SQL> startupORACLE instance started.Total System Global  ...
  • 健康是現代社會永不衰落的話題和關註點,而社會人群里內宅像流行病似的傳染,什麼都想無人參與:無人旅館、無人酒店、無人超市等等,當然不能少了無人健康咨詢,有什麼毛病都只想先網上偷偷查一查、匿名問一問,因此網上疾病問答才會火熱。而今天這份資料庫就是來自於這樣的健康知識問答網站。 全部欄位有:標題、創建日期 ...
  • 社會工作是社會建設的重要組成部分,是一種體現社會主義核心價值理念,堅持“助人自助”宗旨,遵循專業倫理規範,在社會服務與管理等領域,綜合運用專業知識、技能和方法,幫助有需要的個人、家庭、群體、組織和社區,整合社會資源,協調社會關係,預防和解決社會問題,恢復和發展社會功能,促進社會和諧的職業活動。 《1 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...