Mysql探索之Explain執行計畫詳解

2021-10-24 09:33:12 字數 2771 閱讀 3661

explain select * from t3 where id=3952602;

複製**

explain select * from (select * from t3 where id=3952602) a ;

複製**

explain select * from (select * from t3 where id=3952602) a ;

複製**

explain select * from t3 where id = (select id from t3 whereid=3952602 ) ;

複製**

explain select * from t3 where id=3952602 union all select * from t3;

複製**

型別說明using filesort

mysql 有兩種方式可以生成有序的結果,通過排序操作或者使用索引,當 extra **現了 using filesort 說明 mysql 使用了後者,但注意雖然叫 filesort 但並不是說明就是用了檔案來進行排序,只要可能排序都是在記憶體裡完成的。大部分情況下利用索引排序更快,所以一般這時也要考慮優化查詢了。使用檔案完成排序操作,這是可能是 ordery by,group by 語句的結果,這可能是乙個 cpu 密集型的過程,可以通過選擇合適的索引來改進效能,用索引來為查詢結果排序。

using temporary

用臨時表儲存中間結果,常用於 group by 和 order by 操作中,一般看到它說明查詢需要優化了,就算避免不了臨時表的使用也要盡量避免硬碟臨時表的使用。

not exists

mysql 優化了 left join,一旦它找到了匹配 left join 標準的行, 就不再搜尋了。

using index

說明查詢是覆蓋了索引的,不需要讀取資料檔案,從索引樹(索引檔案)中即可獲得資訊。如果同時出現 using where,表明索引被用來執行索引鍵值的查詢,沒有 using where,表明索引用來讀取資料而非執行查詢動作。這是 mysql 服務層完成的,但無需再回表查詢記錄。

using index condition

這是 mysql 5.6 出來的新特性,叫做「索引條件推送」。簡單說一點就是 mysql 原來在索引上是不能執行如 like 這樣的操作的,但是現在可以了,這樣減少了不必要的 io 操作,但是只能用在二級索引上。

using where

使用了 where 從句來限制哪些行將與下一張表匹配或者是返回給使用者。注意:extra 列出現 using where 表示 mysql 伺服器將儲存引擎返回服務層以後再應用 where 條件過濾。

using join buffer

使用了連線快取:block nested loop,連線演算法是塊巢狀迴圈連線;batched key access,連線演算法是批量索引連線

impossible where

where 子句的值總是 false,不能用來獲取任何元組

select tables optimized away

在沒有 group by 子句的情況下,基於索引優化 min/max 操作,或者對於 myisam 儲存引擎優化 count(*)操作,不必等到執行階段再進行計算,查詢執行計畫生成的階段即完成優化。

distinct

優化 distinct 操作,在找到第一匹配的元組後即停止找同樣值的動作

explain 不會告訴你關於觸發器、儲存過程的資訊或使用者自定義函式對查詢的影響情況;

explain 不考慮各種 cache;

explain 不能顯示 mysql 在執行查詢時所作的優化工作;

部分統計資訊是估算的,並非精確值;

expalin 只能解釋 select 操作,其他操作要重寫為 select 後檢視。

(id = 4):【select id, name from t2】:select_type 為 union,說明 id=4 的 select 是 union 裡面的第二個 select。

(id = 3):【select id, name from t1 where address = 『11』】:因為是在 from 語句中包含的子查詢所以被標記為 derived(衍生),where address = 『11』 通過復合索引 idx_name_email_address 就能檢索到,所以 type 為 index。

(id = 2):【select id from t3】:因為是在 select 中包含的子查詢所以被標記為 subquery。

(id = 1):【select d1.name, … d2 from … d1】:select_type 為 primary 表示該查詢為最外層查詢,table 列被標記為 「derived3」表示查詢結果來自於乙個衍生表(id = 3 的 select 結果)。

(id = null):【 … union … 】:代表從 union 的臨時表中讀取行的階段,table 列的 「union 1, 4」表示用 id=1 和 id=4 的 select 結果進行 union 操作。

mysql效能優化之EXPLAIN

mysql效能分析及explain用法的知識是本文我們主要要介紹的內容,接下來就讓我們通過一些實際的例子來介紹這一過程,希望能夠對您有所幫助。1.使用explain語句去檢視分析結果 如explain select from test1 where id 1 會出現 id selecttype ta...

MySQL 之 Explain 輸出分析

mysql 之 explain 輸出分析 前面的文章寫過 mysql 的事務和鎖,這篇文章我們來聊聊 mysql 的 explain,估計大家在工作或者面試中多多少少都會接觸過這個。可能工作中實際使用的不多,但是不論的自己學習還是面試,都需要掌握的。explain 可以使用在select,delet...

MySQL效能優化之explain

在日常工作中,我們會有時會開慢查詢去記錄一些執行時間比較久的sql語句,找出這些sql語句並不意味著完事了,些時我們常常用到explain這個命令來檢視乙個這些sql語句的執行計畫,檢視該sql語句有沒有使用上索引,有沒有做全表掃瞄,這都可以通過explain命令來檢視。所以我們深入了解mysql的...