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
  • 移動開發(一):使用.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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...