(一)查詢計划 釋義
查詢計划: SQL語句是怎樣進行執行的
使用 EXPLAIN 關鍵字可以模擬優化器執行 SQL 查詢語句,從而知道 MySQL 是如何處理你的 SQL 語句的。分析你的查詢語句或是表結構的性能瓶頸。
用法: Explain+SQL 語句。Explain 執行后返回的信息:
(二)具體字段解釋與demo
1 id : select 查詢的序列號,包含一組數字,表示查詢中執行 select 子句或操作表的順序。
id 相同,執行順序由上至下
2 select_type 代表查詢的類型,主要是用於區別普通查詢、聯合查詢、子查詢等的復雜查詢
SIMPLE | 簡單的select 查詢,查詢中不包含子查詢或者union |
PRIMARY | 查詢中若包含任何復雜的子部分,最外層查詢則被標記為Primary |
DERIVED | 在FROM列表中包含的子查詢被標記為DERIVED(衍生) MYSQL會遞歸執行這些子查詢,把結果放在臨時表里 |
SUBQUERY | 在select或where列表中包含了 子查詢 |
DEPEDENT SUBQUERY | 在select或where列表中包含了 子查詢,子查詢基於外層 |
UNCACHEABLE SUBQUERY | 無法使用緩存的子查詢 |
UNION | 若第二個select 出現在UNION之后,則被標記為UNIONL 若UNION包含在from子句的子查詢中,外層select將被標記為:DERIVED |
UNION RESULT | 從UNION表獲取結果的SELECT |
3 table
這個數據是基於哪張表的。
4 type
是查詢的訪問類型。是較為重要的一個指標,結果值從最好到最壞依次是
system | 表只有一行記錄(等於系統表),這是 const 類型的特列,平時不會出現,這個也可以忽略不計 |
const | 表示通過索引一次就找到了,const 用於比較 primary key 或者 unique 索引。因為只匹配一行數據,所以很快 如將主鍵置於 where 列表中,MySQL 就能將該查詢轉換為一個常量 |
eq_ref | 唯一性索引掃描,對於每個索引鍵,表中只有一條記錄與之匹配。常見於主鍵或唯一索引掃描。 |
ref | 非唯一性索引掃描,返回匹配某個單獨值的所有行.本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,然而,它可能會找到多個符合條件的行,所以他應該屬於查找和掃描的混合體。 |
range | 只檢索給定范圍的行,使用一個索引來選擇行。key 列顯示使用了哪個索引一般就是在你的 where 語句中出現了 between、<、>、in 等的查詢這種范圍掃描索引掃描比全表掃描要好,因為它只需要開始於索引的某一點,而結束語另一點,不用掃描全部索引 |
index | 出現index是sql使用了索引但是沒用通過索引進行過濾,一般是使用了覆蓋索引或者是利用索引進行了排序分組 |
all | Full Table Scan,將遍歷全表以找到匹配的行。 |
5 possible_keys
顯示可能應用在這張表中的索引,一個或多個。查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢實際使用。
6 key
實際使用的索引。如果為NULL,則沒有使用索引。
7 key_len
表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度。 key_len 字段能夠幫你檢查是否充分的利用上了索引。ken_len 越長,
說明索引使用的越充分。
8 ref
顯示索引的哪一列被使用了,如果可能的話,是一個常數。哪些列或常量被用於查找索引列上的值。
9 rows
rows 列顯示 MySQL 認為它執行查詢時必須檢查的行數。越少越好!
10 Extra
其他的額外重要的信息。
Using filesort | 說明 mysql 會對數據使用一個外部的索引排序 |
Using temporary | 使了用臨時表保存中間結果,MySQL 在對查詢結果排序時使用臨時表 |
Using index | Using index 代表表示相應的 select 操作中使用了覆蓋索引(Covering Index) |
Using where | 表明使用了 where 過濾 |
Using join buffer | 使用了連接緩存 |
impossible where | impossible where |
select tables optimized away | 查詢執行計划生成的階段即完成優化。 |
好幾次。。。。。。