目錄
explain執行計劃包含的資訊
各欄位詳解
id
select_type
type
綜合Case
執行順序
首頁 資料庫 mysql教程 Mysql中如何查看執行計劃

Mysql中如何查看執行計劃

Aug 30, 2022 pm 01:47 PM
mysql

推薦學習:mysql影片教學

#使用explain關鍵字可以模擬最佳化器執行SQL查詢語句,從而知道MySQL是如何處理你的SQL語句的,分析你的查詢語句或是表格結構的效能瓶頸。

explain執行計劃包含的資訊

其中最重要的欄位為:id、type、key、rows、Extra

各欄位詳解

id

select查詢的序號,包含一組數字,表示查詢中執行select子句或操作表的順序

三種情況:

1、id相同:執行順序由上到下

#2、id不同:如果是子查詢,id的序號會遞增,id值越大優先權越高,越先被執行

#3、id相同又不一樣(兩種情況同時存在):id如果相同,可以認為是一組,從上往下順序執行;在所有組中,id值越大,優先權越高,越先執行

Mysql中如何查看執行計劃

select_type

查詢的類型,主要是用來區分普通查詢、聯合查詢、子查詢等複雜的查詢

  • 1、SIMPLE:簡單的select查詢,查詢中不包含子查詢或union 
  • 2、PRIMARY:查詢中包含任何複雜的子部分,最外層查詢則被標記為primary
  • 3、SUBQUERY:在select 或where清單中包含了子查詢 
  • 4、DERIVED:在from清單中包含的子查詢被標記為derived(衍生),mysql或遞歸執行這些子查詢,把結果放在零時表裡 
  • 5、UNION:若第二個select出現在union之後,則被標記為union;若union包含在from子句的子查詢中,外層select將被標記為derived 
  • 6、UNION RESULT:從union表取得結果的select

type

存取類型,sql查詢最佳化中一個很重要的指標,結果值從好到壞依序是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
登入後複製

一般來說,好的sql查詢至少達到range級別,最好能達到ref

1、system:表格只有一行記錄(等於系統表),這是const類型的特例,平常不會出現,可以忽略不計

#2、const:表示透過索引一次就找到了,const用於比較primary key 或者unique索引。因為只需匹配一行數據,所有很快。如果將主鍵置於where清單中,mysql就能將該查詢轉換為一個const

#3、eq_ref:唯一性索引掃描,對於每個索引鍵,表中只有一筆記錄與之相符。常見於主鍵 或 唯一索引掃描。

注意:ALL全表掃描的表記錄最少的表如t1表

4、ref:非唯一性索引掃描,傳回符合某個單獨值的所有行。本質是也是一種索引訪問,它返回所有匹配某個單獨值的行,然而他可能會找到多個符合條件的行,所以它應該屬於查找和掃描的混合體

5、range:只檢索給定範圍的行,使用一個索引來選擇行。 key列顯示使用了那個索引。一般就是在where語句中出現了bettween、、in等的查詢。這種索引列上的範圍掃描比全索引掃描好。只需要開始於某一點,結束於另一個點,不用掃描全部索引#​​

6、index:Full Index Scan,index與ALL區別為index類型只遍歷索引樹。這通常為ALL塊,應為索引檔案通常比資料檔案小。 (Index與ALL雖然都是讀全表,但index是從索引中讀取,而ALL是從硬碟讀取)

##7、ALL:Full Table Scan,遍歷全表以找到匹配的行

#possible_keys

查詢涉及到的欄位上存在索引,則該索引將被列出,但不一定被查詢實際使用

key

實際使用的索引,如果為NULL,則沒有使用索引。

查詢中如果使用了覆寫索引,則該索引只出現在key清單中

##key_len

表示索引中使用的位元組數,查詢中使用的索引的長度(最大可能長度),並非實際使用長度,理論上長度越短越好。 key_len是根據表定義計算而得的,不是透過表內檢索出的

ref

#顯示索引的那一列被使用了,如果可能,就是一個常數const。

rows

根據表格統計資訊及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數

Extra

#不適合在其他欄位中顯示,但是十分重要的額外資訊

1、Using filesort :

mysql對資料使用一個外部的索引排序,而不是依照表內的索引進行排序讀取。也就是說mysql無法利用索引完成的排序操作成為「檔案排序」

由於索引是先按email排序、再按address排序,所以查詢時如果直接按address排序,索引就不能滿足要求了,mysql內部必須再實作一次「檔案排序」

#2、Using temporary:

使用暫存表儲存中間結果,也就是說mysql在對查詢結果排序時使用了臨時表,常見於order by 和group by

#3、Using index:

表示對應的select操作中使用了

覆蓋索引(Covering Index),避免了存取表的資料行,效率高

如果同時出現Using where,表示索引被用來執行索引鍵值的查找(參考上圖)如果沒用同時出現Using where,表示索引用來讀取資料而非執行查找動作

    覆寫索引
  • (Covering Index):也叫索引覆寫。就是select列表中的字段,只用從索引中就能獲取,不必根據索引再次讀取資料文件,換句話說
  • 查詢列要被所建的索引覆蓋
注意:

a、如需使用覆蓋索引,select列表中的欄位只取出需要的列,不要使用select *

b、如果將所有欄位都建索引會導致索引檔案過大,反而降低crud效能

4、Using where :

使用了where過濾

#5、Using join buffer :

使用了連結快取

6、Impossible WHERE:

where子句的值總是false,不能用來取得任何元祖

7、select tables optimized away:

#在沒有group by子句的情況下,基於索引最佳化MIN/MAX操作或對於MyISAM儲存引擎最佳化COUNT(*)操作,不必等到執行階段在進行計算,查詢執行計畫產生的階段即可完成最佳化####### ##8、distinct:#########優化distinct操作,在找到第一個匹配的元祖後即停止找同樣值得動作###

綜合Case

執行順序

1(id = 4)、【select id, name from t2】:select_type 為union,說明id =4的select是union裡面的第二個select。

2(id = 3)、【select id, name from t1 where address = '11'】:因為是在from語句中包含的子查詢所以被標記為DERIVED(衍生),where address = '11' 透過複合索引idx_name_email_address就能檢索到,所以type為index。

3(id = 2)、【select id from t3】:因為是在select中包含的子查詢所以被標記為SUBQUERY。

4(id = 1)、【select d1.name, … d2 from … d1】:select_type為PRIMARY表示該查詢為最外層查詢,table列被標記為「derived3」表示查詢結果來自於一個衍生表(id = 3 的select結果)。

5(id = NULL)、【 … union …】:代表從union的臨時表讀取行的階段,table列的「union 1, 4」表示用 id=1 和id=4的select結果進行union操作。

推薦學習:mysql影片教學

#

以上是Mysql中如何查看執行計劃的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MySQL:初學者的數據管理易用性 MySQL:初學者的數據管理易用性 Apr 09, 2025 am 12:07 AM

MySQL適合初學者使用,因為它安裝簡單、功能強大且易於管理數據。 1.安裝和配置簡單,適用於多種操作系統。 2.支持基本操作如創建數據庫和表、插入、查詢、更新和刪除數據。 3.提供高級功能如JOIN操作和子查詢。 4.可以通過索引、查詢優化和分錶分區來提升性能。 5.支持備份、恢復和安全措施,確保數據的安全和一致性。

忘記數據庫密碼,能在Navicat中找回嗎? 忘記數據庫密碼,能在Navicat中找回嗎? Apr 08, 2025 pm 09:51 PM

Navicat本身不存儲數據庫密碼,只能找回加密後的密碼。解決辦法:1. 檢查密碼管理器;2. 檢查Navicat的“記住密碼”功能;3. 重置數據庫密碼;4. 聯繫數據庫管理員。

navicat premium怎麼創建 navicat premium怎麼創建 Apr 09, 2025 am 07:09 AM

使用 Navicat Premium 創建數據庫:連接到數據庫服務器並輸入連接參數。右鍵單擊服務器並選擇“創建數據庫”。輸入新數據庫的名稱和指定字符集和排序規則。連接到新數據庫並在“對象瀏覽器”中創建表。右鍵單擊表並選擇“插入數據”來插入數據。

mysql:簡單的概念,用於輕鬆學習 mysql:簡單的概念,用於輕鬆學習 Apr 10, 2025 am 09:29 AM

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

MySQL和SQL:開發人員的基本技能 MySQL和SQL:開發人員的基本技能 Apr 10, 2025 am 09:30 AM

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。

Navicat for MariaDB如何查看數據庫密碼? Navicat for MariaDB如何查看數據庫密碼? Apr 08, 2025 pm 09:18 PM

Navicat for MariaDB 無法直接查看數據庫密碼,因為密碼以加密形式存儲。為確保數據庫安全,有三個方法可重置密碼:通過 Navicat 重置密碼,設置複雜密碼。查看配置文件(不推薦,風險高)。使用系統命令行工具(不推薦,需要對命令行工具精通)。

navicat怎麼新建連接mysql navicat怎麼新建連接mysql Apr 09, 2025 am 07:21 AM

可在 Navicat 中通過以下步驟新建 MySQL 連接:打開應用程序並選擇“新建連接”(Ctrl N)。選擇“MySQL”作為連接類型。輸入主機名/IP 地址、端口、用戶名和密碼。 (可選)配置高級選項。保存連接並輸入連接名稱。

phpmyadmin怎麼打開 phpmyadmin怎麼打開 Apr 10, 2025 pm 10:51 PM

可以通過以下步驟打開 phpMyAdmin:1. 登錄網站控制面板;2. 找到並點擊 phpMyAdmin 圖標;3. 輸入 MySQL 憑據;4. 點擊 "登錄"。

See all articles