explain是MySQL中執行計劃分析的利器,經常用來分析低效SQL。通過explain我們可以獲取到數據的訪問類型、索引的使用、分區信息等情況。這裏列舉以下explain分析的結果含義。
select_type
表示select的類型,常見的取值有simple(簡單表,即不使用表連接或者子查詢)、primary(主查詢,即外層的查詢)、union(union中的第二個或者後面的查詢語句)、subquery(子查詢中的第一個select)等
table
輸出結果集的表
type
表示MySQL在表中找到所需行的方式,或者叫訪問類型。常見的訪問類型有以下幾種:
all、index、range、ref、eq_ref、const/system、null
從左到右,性能由差到好
- all:全表掃描,MySQL遍歷全表來找到匹配的行
- index:索引全掃描,MySQL遍歷整個索引來查詢匹配的行
- range:索引範圍掃描,常見於<、<=、>、>=、between等操作符
- ref:使用非唯一索引掃描或唯一索引的前綴掃描,返回匹配某個單獨值的記錄行
- eq_ref:類似ref,區別就在使用的索引是唯一索引(unique),對於每個索引值,表中只有一條記錄匹配
- const/system:單表中最多有一個匹配行,查詢起來非常迅速,所以這個匹配行中的其他列的值可以被優化器在當前查詢中當做常量來處理
- null:MySQL不用訪問表或者索引,直接就能夠得到結果
possible_keys
表示查詢時可能使用的索引
key
表示實際使用的索引
key_len
使用到索引的長度
rows
掃描行的數量
extra
執行情況的說明和描述,包含不適合在其他列中顯示但是對執行計劃非常重要的額外信息
partitions
如果進行了分區的話,返回訪問的SQL分區
以上基本就是explain結果的基本字段含義了。另外MySQL還可以追加使用"show warnings\G"命令,來查看SQL真正被執行之前優化器做了哪些改寫。如: