1. 程式人生 > 其它 >MySql執行計劃explain的解讀

MySql執行計劃explain的解讀

MySql資料庫相信各位都很熟悉,工作中中小型公司都會選擇使用MySql,各位在工作中肯定也寫過一下sql語句,進行一下sql語句的優化,那麼你在優化sql語句裡看過相應的explain嗎,知道相應引數是什麼意思嗎?在進行sql語句優化的時候,理解執行計劃中各個引數的意思,弄明白執行的順序,對sql優化有很大的幫助。

首先,我們要知道怎麼看執行計劃,下圖是通過命令檢視執行計劃

有一部分同學在工作中使用的是Navicat來操作資料庫的,那麼來看看Navicat中是怎麼檢視執行計劃的:

在Navicat中執行完相應的sql語句,然後點選解釋,其實執行計劃就是解釋怎麼執行的sql語句,有的版本的“解釋”按鈕在上面,有的版本的“解釋”按鈕在下面,大家視版本不同而定。

下面講講一下執行計劃中各個引數的意思:

id:執行順序
分為三種情況:id一樣;id不一樣;id既存在一樣的,又存在不一樣的

id一樣的,執行順序從上到下;id不一樣的,id越大,等級越高,執行順序約先;id既存在相同又存在不同的,相同id的為一組,不同id的為不同組,不同組之間id越大,等級越高,越先執行,同組之間,執行順序從上到下。

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

table:表名
type:查詢的型別
自上而下,由差到最好,一般來說,好的sql查詢至少達到range級別,最好能達到ref
ALL:全表掃描;
index:遍歷索引樹,index與ALL區別為index型別只遍歷索引樹,Index與ALL雖然都是讀全表,但index是從索引中讀取,而ALL是從硬碟讀取;
range:索引範圍掃描,只檢索給定範圍的行,使用一個索引來選擇行。key列顯示使用了那個索引。一般就是在where語句中出現了bettween、<、>、in等的查詢。這種索引列上的範圍掃描比全索引掃描要好。只需要開始於某個點,結束於另一個點,不用掃描全部索引;
ref:非唯一性索引掃描,返回匹配某個單獨值的所有行;
eq_ref:唯一性索引掃描,對於每個索引鍵,表中只有一條記錄與之匹配;
const,system:常量轉換;
NULL:分解語句,執行時甚至不用訪問表或索引

possible_keys:查詢涉及到的欄位上的索引,則該索引將被列出,但不一定被查詢實際使用
key:SQL語句實際用到的索引
key_len:使用的索引的位元組數,表示索引中使用的位元組數,查詢中使用的索引的長度(最大可能長度),並非實際使用長度,理論上長度越短越好。key_len是根據表定義計算而得的,不是通過表內檢索出的
ref:哪些列或常量被用於查詢索引列上的值
rows:得到資料所需要讀取的行數
Extra:其他重要資訊

原文連結:https://blog.csdn.net/xiaoye319/article/details/85261442