Mysql-Explain用法詳解


使用方式:Explain + SQL語句

1.Explain能幹嘛

在這裏插入圖片描述

2.Explain包含的表頭信息

在這裏插入圖片描述

3.Explain-id(表的讀取順序)

這裏的id不是主鍵,它是一組數字12345這種,表示我們進行表查詢的先後順序,其中id可以有三種情況:id相同,id不同,id同時相同和不同

3.1 id相同

看一個demo:
在這裏插入圖片描述
這種情況下,根據Explain中的table信息從上而下執行

3.2 id不同

在這裏插入圖片描述

3.3 id相同又不同

在這裏插入圖片描述

4. Explain-Select_type(數據讀取操作的操作類型)

這個字段的取值有以下幾種:
在這裏插入圖片描述
這六種類型的解釋如下:
在這裏插入圖片描述

5. Table

這個就不用多解釋了,就是在explain顯示後的數據中表示這一行的數據來自哪張表

6. Type

字面意思是訪問類型,它有8種值:
在這裏插入圖片描述
這8種類型從好到差的順序是:system>const>eq_ref>ref>range>index>ALL,下面來解釋:

  • system:只有一行記錄,相當於系統表,可以忽略不記
  • const:常量,表示通過索引一次就找到了,常用於匹配主鍵或者unique索引,值匹配一行數據
  • eq_ref:唯一性索引掃描,對於每個索引鍵,表中只有一條記錄與之匹配
  • ref:非唯一性索引掃描,返回匹配到的某個值的所有行
  • range:只檢索給定範圍的行,一般情況下是where語句後加了between,>,<,in等條件
  • index和ALL:index遍歷全部索引,ALL讀全表,index比ALL塊因爲index從索引讀取,ALL從硬盤讀取

7. possible_keys和key

possible_keys:顯示可能應用在這張表種的索引,一個或多個,但不一定被使用
Key:實際使用的索引,如果爲NULL,則沒有使用索引,若使用了覆蓋索引,則該索引僅出現在Key列表種
覆蓋索引
在這裏插入圖片描述

關於覆蓋索引更詳細的討論請看:MySQL中最左原則和覆蓋索引的討論

8. Key_len

表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度,在不損失精度的情況下,長度越短越好

9. ref

顯示和索引匹配的哪一列被使用了,展示的就是與索引列做等值匹配的條件,如常量或某個列
在這裏插入圖片描述

10. rows

rows列顯示MySQL認爲它執行查詢時必須檢查的行數。注意這是一個預估值,越少越好

11. Extra

Extra是EXPLAIN輸出中另外一個很重要的列,該列顯示MySQL在查詢過程中的一些詳細信息,MySQL查詢優化器執行查詢的過程中對查詢計劃的重要補充信息。

類型 說明
Using filesort 說明mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取,MySql中無法利用索引完成的排序操作稱爲”文件排序“
Using temporary 用臨時表保存中間結果,常用於GROUP BYORDER BY操作中,一般看到它說明查詢需要優化了,就算避免不了臨時表的使用也要儘量避免硬盤臨時表的使用。
Not exists MYSQL優化了LEFT JOIN,一旦它找到了匹配LEFT JOIN標準的行, 就不再搜索了。
Using index 說明查詢是覆蓋了索引的,不需要讀取數據文件,從索引樹(索引文件)中即可獲得信息。如果同時出現using where,表明索引被用來執行索引鍵值的查找,沒有using where,表明索引用來讀取數據而非執行查找動作。這是MySQL服務層完成的,但無需再回表查詢記錄。
Using index condition 這是MySQL 5.6出來的新特性,叫做“索引條件推送”。簡單說一點就是MySQL原來在索引上是不能執行如like這樣的操作的,但是現在可以了,這樣減少了不必要的IO操作,但是隻能用在二級索引上。
Using where 使用了WHERE從句來限制哪些行將與下一張表匹配或者是返回給用戶。注意:Extra列出現Using where表示MySQL服務器將存儲引擎返回服務層以後再應用WHERE條件過濾。
Using join buffer 使用了連接緩存:Block Nested Loop,連接算法是塊嵌套循環連接;Batched Key Access,連接算法是批量索引連接
impossible where where子句的值總是false,不能用來獲取任何元組
select tables optimized away 在沒有GROUP BY子句的情況下,基於索引優化MIN/MAX操作,或者對於MyISAM存儲引擎優化COUNT(*)操作,不必等到執行階段再進行計算,查詢執行計劃生成的階段即完成優化。
distinct 優化distinct操作,在找到第一匹配的元組後即停止找同樣值的動作

附:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章