本文主要介紹在執行expain命令獲得的結果的各個字段的含義。
執行方式
expain +[SQL]
返回字段含義
字段名 | 含義 | 可能值 | 可能值的含義 |
---|---|---|---|
id | SQL執行的順利的標識,SQL從大到小的執行 | [數字] | |
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 | 顯示了連接使用了哪種類別,有無使用索引 | const(system) | 表最多有一個匹配行,它將在查詢開始時被讀取 |
eq_ref | 唯一性索引掃描 | ||
ref | 非唯一性索引掃描,返回匹配某個單獨值的所有行 | ||
range | 只檢索給定範圍的行,使用一個索引來選擇行 | ||
index | Full Index Scan,Index與All區別爲index類型只遍歷索引樹 | ||
all | Full Table Scan 將遍歷全表以找到匹配的行 | ||
possible_key | 顯示可能應用在這張表中的索引,一個或多個。查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢實際使用 | ||
key | 實際使用的索引,如果爲NULL,則沒有使用索引。(可能原因包括沒有建立索引或索引失效) | ||
key_len | 表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度,在不損失精確性的情況下,長度越短越好 |
||
rows | 根據表統計信息及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數,也就是說,用的越少越好 | ||
Extra | 該列包含MySQL解決查詢的詳細信息 | Distinct | 一旦MYSQL找到了與行相聯合匹配的行,就不再搜索了 |
Not exists | MYSQL優化了LEFT JOIN,一旦它找到了匹配LEFT JOIN標準的行, 就不再搜索了 | ||
Range checked for each | 沒有找到理想的索引,因此對於從前面表中來的每一個行組合,MYSQL檢查使用哪個索引,並用它來從表中返回行。這是使用索引的最慢的連接之一 | ||
Using filesort | 看到這個的時候,查詢就需要優化了。MYSQL需要進行額外的步驟來發現如何對返回的行排序。它根據連接類型以及存儲排序鍵值和匹配條件的全部行的行指針來排序全部行 | ||
Using index | 列數據是從僅僅使用了索引中的信息而沒有讀取實際的行動的表返回的,這發生在對錶的全部的請求列都是同一個索引的部分的時候 | ||
Using temporary | 看到這個的時候,查詢需要優化了。這裏,MYSQL需要創建一個臨時表來存儲結果,這通常發生在對不同的列集進行ORDER BY上,而不是GROUP BY上 | ||
Using where | 使用了WHERE從句來限制哪些行將與下一張表匹配或者是返回給用戶。如果不想返回表中的全部行,並且連接類型ALL或index,這就會發生,或者是查詢有問題 | ||
using join buffer | 表明使用了連接緩存,比如說在查詢的時候,多表join的次數非常多,那麼將配置文件中的緩衝區的join buffer調大一些。 |
參考:https://blog.csdn.net/qq_27399407/article/details/93741225