EXPLAIN用法
-- 實際SQL,查找用戶名爲Jefabc的員工
select * from emp where name = 'Jefabc';
-- 查看SQL是否使用索引,前面加上explain即可
explain select * from emp where name = 'Jefabc';
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-n4WOJe0W-1577251291919)(/images/explain.png)]
- id:選擇標識
- select_type:表示查詢的類型。
- table:輸出結果集的表
- partitions:匹配的分區
- type:表示表的連接類型
- possible_keys:表示查詢時,可能使用的索引
- key:表示實際使用的索引
- key_len:索引字段的長度
- ref:列與索引的比較
- rows:掃描出的行數(估算的行數)
- filtered:按表條件過濾的行百分比
- Extra:執行情況的描述和說明
select_type
二、select_type
查詢中每個select子句的類型
(1) SIMPLE(簡單SELECT,不使用UNION或子查詢等)
(2) PRIMARY(子查詢中最外層查詢,查詢中若包含任何複雜的子部分,最外層的select被標記爲PRIMARY)
(3) UNION(UNION中的第二個或後面的SELECT語句)
(4) DEPENDENT UNION(UNION中的第二個或後面的SELECT語句,取決於外面的查詢)
(5) UNION RESULT(UNION的結果,union語句中第二個select開始後面所有select)
(6) SUBQUERY(子查詢中的第一個SELECT,結果不依賴於外部查詢)
(7) DEPENDENT SUBQUERY(子查詢中的第一個SELECT,依賴於外部查詢)
(8) DERIVED(派生表的SELECT, FROM子句的子查詢)
(9) UNCACHEABLE SUBQUERY(一個子查詢的結果不能被緩存,必須重新評估外鏈接的第一行)
三、type
對錶訪問方式,表示MySQL在表中找到所需行的方式,又稱“訪問類型”。
常用的類型有: ALL、index、range、 ref、eq_ref、const、system、NULL(從左到右,性能從差到好)
ALL:Full Table Scan, MySQL將遍歷全表以找到匹配的行。
index: Full Index Scan,index與ALL區別爲index類型只遍歷索引樹。select camera_id from camera。
range:只檢索給定範圍的行,使用一個索引來選擇行。
ref: 表示上述表的連接匹配條件,即哪些列或常量被用於查找索引列上的值。用非主鍵的索引去查詢時,是ref
eq_ref: 類似ref,區別就在使用的索引是唯一索引,對於每個索引鍵值,表中只有一條記錄匹配,簡單來說,就是多表連接中使用primary key或者 unique key作爲關聯條件。
const、system: 當MySQL對查詢某部分進行優化,並轉換爲一個常量時,使用這些類型訪問。如將主鍵置於where列表中,MySQL就能將該查詢轉換爲一個常量,system是const類型的特例,當查詢的表只有一行的情況下,使用system。用主鍵去查詢的時候,是const
NULL: MySQL在優化過程中分解語句,執行時甚至不用訪問表或索引,例如從一個索引列裏選取最小值可以通過單獨索引查找完成。
四、rows
估算出結果集行數,表示MySQL根據表統計信息及索引選用情況,估算找到所需的記錄所需要讀取的行數注意這裏,不是指最終結果,而是指找到所需記錄需要讀取的行數。
五、Extra
using where: 表明使用了where去過濾,不要以爲有其他意思,網上很多說法有問題。
using index:表明使用了覆蓋索引,即查詢的內容可以從索引直接獲取。
Using filesort:說明mysql會對數據適用一個外部的索引排序。而不是按照表內的索引順序進行讀取。MySQL中無法利用索引完成排序操作稱爲“文件排序”。
Using temporary:使用了臨時表保存中間結果,mysql在查詢結果排序時使用臨時表。常見於排序order by和分組查詢group by。
using join buffer:使用了連接緩存
impossible where:where子句的值總是false,不能用來獲取任何元組
select tables optimized away:在沒有group by子句的情況下,基於索引優化Min、max操作或者對MyISAM存儲引擎優化count(*),不必等到執行階段再進行計算,查詢執行計劃生成的階段即完成優化。