用EXPLAIN分析sql執行情況

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(*),不必等到執行階段再進行計算,查詢執行計劃生成的階段即完成優化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章