sql執行經過解析器和優化器生成執行計劃,可以通過explain模擬優化器執行sql生成的執行計劃,讓我們知道優化器是如何分析sql語句的,讓我們調整查詢語句和修改表結構提高查詢性能。explain的信息主要包含一下字段
id:查詢計劃的序列號分為幾個查詢,從上到下依次執行;id相同的查詢是一組查詢,子查詢序列號大,優先查詢
select_type:查詢類型,復雜查詢分為三類:簡單子查詢、派生表(from語句中的子查詢)、union 查詢
simple(普通查詢) primary(復雜查詢也就是子查詢的外層select標記為primary) subquery(子查詢) derived(from列表中包含子查詢,生成臨時表,衍生查詢) union(union兩個結果) union result(從union結果中select)
type 獲取數據的類型,是查詢sql優化的最重要的類型,type值的類型區分sql查詢返回結果要訪問的數據。syatem系統表只有一行記錄;const通過索引一次就能找到,只需要匹配一行,直接查詢主鍵的情況;eq_ref:唯一索引掃描,掃描主鍵或唯一索引的情況;ref:非唯一索引掃描;range:范圍掃描,where中出現betewwn < > in等的查詢,在索引列上范圍查詢當然比全索引查找好的多;index:全索引掃描,只掃描索引tree;all:全表掃描,遍歷整個表;
possibles_keys:執行計劃可能被使用到的索引,但是不一定真能用到只是一個比較分析,用到的key一定在這里邊,可以use index強制使用這里邊的key
key:執行計劃真正用到的索引,值是表結構的索引或者沒有索引(null);其中查詢字段和用到的索引重合會索引覆蓋,就是不用回表查詢數據了
key_len:和key相關聯,就是索引用到的字節數,理論上越小越好
ref:索引的哪個列被使用,表示哪些列或常量被用于用于查找索引列上的值;當然const最好
rows:掃描的行數,回表查詢數據需要掃描多少行,越小越好
extra:額外信息,是否內存排序using filesort,就是索順序和查詢順序不一樣需要對數據進行排序;using temporary 使用了臨時表,就是出現子查詢 或者order by、group by 的情況下,查詢出數據生成臨時表在臨時表上做操作;using index就是前邊說的索引覆蓋,不需要回表查詢的情況;using where:使用了where條件查詢;using join buffer 連表緩存;impossible where:無效的where條件
另外sql關鍵字的執行順序和sql語句的順序是不一致的
from ->on -> join -> where -> group by -> having -> select -> destict -> orderby -> limit