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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...