mysql的執行計划
EXPLAIN SELECT * from employees where employees.gender='M'
返回的結果如下:
id是一組數字,表示查詢中執行select子句或操作表的順序。
如果id相同,則執行順序從上至下。
如果是子查詢,id的序號會遞增,id越大則優先級越高,越先會被執行。
id如果相同,則可以認為是一組,從上往下順序執行,所有組中,id越高,優先級越高,越容易執行。
selecttype有simple,primary,subquery,derived(衍生),union,unionresult。
simple表示查詢中不包含子查詢或者union。
當查詢中包含任何復雜的子部分,最外層的查詢被標記成primary。
在select或where列表中包含了子查詢,則子查詢被標記成subquery。
在from的列表中包含的子查詢被標記成derived。
若第二個select出現在union后,則被標記成union,若union在from子句的子查詢中,外層的select被標記成derived。
從union表獲取結果的select被標記成union result。
type叫訪問類型,表示在表中找到所需行的方式,常見類型有
all,index,range,ref,eq_ref,const,system,NULL 性能從左至右由差至好。
ALL,即full table scan,mysql將遍歷全表來找到所需要的行。
index為full index scan,只遍歷索引樹。
range表示索引范圍掃描 ,對索引的掃描開始於一點,返回匹配的值域的行,常見於between,<,>的查詢。
ref為非唯一性索引掃描,返回匹配某個單獨值的所有行,常見於非唯一索引即唯一索引的非唯一前綴進行的查找。
const,system表示當對查詢部分進行優化,並轉化成一個常量時,使用這些類型訪問。比如將主鍵置於where列表中,mysql就能把該查詢置成一個常量。system是const的一個特例,當查詢表中只有一行的情況下使用的是system。
NULL表示在執行語句中,不用查表或索引。
possiblekey表示能使用哪個索引在表中找到行,查詢涉及到的字段上若存在索引,則該索引被列出,但不一定被查詢使用。