MySQL優化性能之explain詳細介紹

MySQL高級語法——Explain簡介

一、概述

​ Mysql所提供的explain關鍵詞是用於調優排患的一個神器,通過它可以分析查詢語句的執行情況,DBA可以通過分析語句的執行結果對查詢語句甚至表結構進行優化,例如添加索引,修改索引,使用覆蓋索引等等。

二、基本結構介紹

id

​ id是爲select 的序列號,如果有多個select,那麼將有多個id,並且id的順序將根據select出現的順序而增加。MySQL將select查詢分爲簡單查詢和複雜查詢。複雜查詢分爲三類:簡單子查詢、派生表(from語句中的子查詢)和聯合查詢。


select_type

​ select_type 表示爲查詢的類型,其中分爲了如下幾種類型:

  • SIMPLE(簡單SELECT,沒有實用UNION或子查詢等其他)
EXPLAIN SELECT * FROM emp WHERE sal>'20000';

在這裏插入圖片描述

  • PRIMARY(查詢中若包含任何複雜的子部分,最外層的select被標記爲PRIMARY)
  • DERIVED( 位於FROM後的的子查詢,也稱爲派生表的SELECT)
EXPLAIN SELECT
z.*,d.dname,d.loc
FROM dept d, (SELECT deptno, COUNT(*) cnt FROM emp GROUP BY deptno) z
WHERE z.deptno=d.deptno;

在這裏插入圖片描述

  • UNION(UNION中出現的第二個SELECT語句)

  • UNION RESULT(UNION的結果),從 union 臨時表檢索結果的 select

  • SUBQUERY 它是子查詢中的出現的第一個SELECT,它是不在from後的子查詢

EXPLAIN
SELECT *
FROM emp e
WHERE e.sal > (SELECT sal FROM emp WHERE ename='關羽')
UNION
SELECT *
FROM emp e
WHERE e.sal > (SELECT sal FROM emp WHERE ename='關羽');

在這裏插入圖片描述

table

​ 表示對哪個表進行的查詢,有時候可能不是真實存在的表名字,例如:當 from 子句中有子查詢時,table列是 格式,表示當前查詢依賴 id=N 的查詢,於是先執行 id=N 的查詢。當有 union 時,UNION RESULT 的 table 列的值爲 <union1,2>,1和2表示參與 union 的 select 行id。

partitions

​ 表示在哪個分區使用

type

​ 表示查詢的方式或訪問類型,常用的訪問類型有:

system > const > eq_ref > ref > fulltext > index_merge > unique_subquery > index_subquery > range > index > all (依次表示查詢類型的性能排序,從優到差)

ALL: 對全表數據進行查詢遍歷

index: 它通過表中索引進行查詢,通常比ALL快很多

range: 使用一個索引來選擇行,範圍掃描通常出現在 in(), between ,> ,<, >= 等操作中。

在這裏插入圖片描述

表示上述表的連接匹配條件,即哪些列或常量被用於查找索引列上的值

eq_ref: 簡單來說,就是多表連接中使用primary key或者 unique key作爲關聯條件,多表之間的關聯之間可見。

EXPLAIN
SELECT e.empno, e.ename, d.dname
FROM emp e LEFT JOIN emp m 
ON e.mgr=m.empno 
LEFT JOIN dept d ON e.deptno=d.deptno
WHERE e.hiredate<m.hiredate;

在這裏插入圖片描述

const、system: mysql能對查詢的某部分進行優化並將其轉化成一個常量,用於 primary key 或 unique key 的所有列與常數比較時,所以表最多有一個匹配行,讀取1次,速度比較快。

mysql> explain extended select * from (select * from film where id = 1) tmp;

在這裏插入圖片描述

NULL

在這裏插入圖片描述

MySQL能夠在優化階段分解查詢語句,在執行階段用不着再訪問表或索引。例如:在索引列中選取最小值,可以單獨查找索引來完成,不需要在執行時訪問表

MySQL在優化過程中分解語句,執行時甚至不用訪問表或索引,例如從一個索引列裏選取最小值可以通過單獨索引查找完成。

possible_keys

如果查詢的表中建立有索引怎可能會被顯示到這裏,但也不一定被查詢使用。(不一定有索引就一定顯示索引出來)explain 時可能出現 possible_keys 有列,而 key 顯示 NULL 的情況,這種情況是因爲表中數據不多,mysql認爲索引對此查詢幫助不大,選擇了全表查詢。

key

若沒有使用索引,則鍵是NULL。若想要強制MySQL使用或忽視possible_keys列中的索引,在查詢中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

key_len

表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度(key_len顯示的值爲索引字段的最大可能長度,並非實際使用長度,即key_len是根據表定義計算而得,不是通過表內檢索出的)

不損失精確性的情況下,長度越短越好

ref

這一列顯示了在key列記錄的索引中,表查找值所用到的列或常量,常見的有:const(常量),func,NULL,字段名(例:film.id)【表示上述表的連接匹配條件,即哪些列或常量被用於查找索引列上的值】

rows

表示是MySQL估計要讀取並檢測的行數,並不是結果集裏的行數。

Extra


Using where: 列數據是從僅僅使用了索引中的信息而沒有讀取實際的行動的表返回的,這發生在對錶的全部的請求列都是同一個索引的部分的時候,表示mysql服務器將在存儲引擎檢索行後再進行過濾

Using temporary: 表示MySQL需要使用臨時表來存儲結果集,常見於排序和分組查詢

Using filesort: MySQL中無法利用索引完成的排序操作稱爲“文件排序”

Using join buffer: 改值強調了在獲取連接條件時沒有使用索引,並且需要連接緩衝區來存儲中間結果。如果出現了這個值,那應該注意,根據查詢的具體情況可能需要添加索引來改進能。

Impossible where: 這個值強調了where語句會導致沒有符合條件的行。

Select tables optimized away: 這個值意味着僅通過使用索引,優化器可能僅從聚合函數結果中返回一行

參考來源:

https://www.cnblogs.com/butterfly100/archive/2018/01/15/8287569.html

https://www.cnblogs.com/xuanzhi201111/p/4175635.html

img

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