mysql中explain執行計畫的用法及含義
explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇更好的索引和寫出更優化的查詢語句。
檢視mysql優化器優化後的sql結果步驟:
通過exlpain +sql 語句分析sql語句的效能
explain 語句中id列的值
id相同執行順序由上至下。
id不同,id值越大優先順序越高,越先被執行。
id為null時表示乙個結果集,不需要使用它查詢,常出現在包含union等查詢語句中
explain語句中select_type列的值
explain 語句中type列的值
特別注意的是:type顯示的是訪問型別,是較為重要的乙個指標,結果值從最好到最壞依次是:從上到下效能依次變差。一般來說,得保證查詢至少達到range級別,最好能達到ref。
explain 語句中其他列的含義
possible_keys: 可能使用的索引,注意不一定會使用。查詢涉及到的字段上若存在索引,則該索引將被列出來。
key: 實際使用的索引,若沒有使用索引,顯示為null
key_length: 索引長度
ref: 表示上述表的連線匹配條件,即哪些列或常量被用於查詢索引列上的值
rows: 返回估算的結果集數目,並不是乙個準確的值。
extra: 常見以下幾種:
extra列返回的描述的意義
關於mysql如何解析查詢的額外資訊。但這裡可以看到的壞的例子是using temporary和using filesort,意思mysql根本不能使用索引,結果是檢索會很慢。
distinct:一旦mysql找到了與行相聯合匹配的行,就不再搜尋了
not exists: mysql優化了left join,一旦它找到了匹配left join標準的行,就不再搜尋了
range checked for each record(index map:#):沒有找到理想的索引,因此對於從前面表中來的每乙個行組合,mysql檢查使用哪個索引,並用它來從表中返回行。這是使用索引的最慢的連線之一
using filesort: 看到這個的時候,查詢就需要優化了。mysql需要進行額外的步驟來發現如何對返回的行排序。它根據連線型別以及儲存排序鍵值和匹配條件的全部行的行指標來排序全部行
using index: 列資料是從僅僅使用了索引中的資訊而沒有讀取實際的行動的表返回的,這發生在對錶的全部的請求列都是同乙個索引的部分的時候
using index:所需資料只需在 index 即可全部獲得,不須要再到表中取資料。
using index for group-by:資料訪問和 using index 一樣,所需資料只須要讀取索引,當query 中使用group by或distinct 子句時,如果分組欄位也在索引中,extra中的資訊就會是 using index for group-by。using temporary 看到這個的時候,查詢需要優化了。這裡,mysql需要建立乙個臨時表來儲存結果,這通常發生在對不同的列集進行order by上,而不是group by上
using where:如果不讀取表的所有資料,或不是僅僅通過索引就可以獲取所有需要的資料,則會出現 using where 資訊。
using where with pushed condition:這是乙個僅僅在 ndbcluster儲存引擎中才會出現的資訊,而且還須要通過開啟 condition pushdown 優化功能才可能被使用。控制引數為 engine_condition_pushdown 。
impossible where noticed after reading const tables:mysql query optimizer 通過收集到的統計資訊判斷出不可能存在結果。
where used 使用了where從句來限制哪些行將與下一張表匹配或者是返回給使用者。如果不想返回表中的全部行,並且連線型別all或index,這就會發生,或者是查詢有問題不同連線型別的解釋(按照效率高低的順序排序)
system 表只有一行:system表。這是const連線型別的特殊情況
const:表中的乙個記錄的最大值能夠匹配這個查詢(索引可以是主鍵或惟一索引)。因為只有一行,這個值實際就是常數,因為mysql先讀這個值然後把它當做常數來對待
eq_ref:在連線中,mysql在查詢時,從前面的表中,對每乙個記錄的聯合都從表中讀取乙個記錄,它在查詢使用了索引為主鍵或惟一鍵的全部時使用
ref:這個連線型別只有在查詢使用了不是惟一或主鍵的鍵或者是這些型別的部分(比如,利用最左邊字首)時發生。對於之前的表的每乙個行聯合,全部記錄都將從表中讀出。這個型別嚴重依賴於根據索引匹配的記錄多少—越少越好
range:這個連線型別使用索引返回乙個範圍中的行,比如使用》或《查詢東西時發生的情況
index: 這個連線型別對前面的表中的每乙個記錄聯合進行完全掃瞄(比all更好,因為索引一般小於表資料)
all:這個連線型別對於前面的每乙個記錄聯合進行完全掃瞄,這一般比較糟糕,應該盡量避免
no tables:query 語句中使用 from dual或不包含任何 from子句。
not exists:在某些左連線中,mysql query optimizer通過改變原有 query 的組成而使用的優化方法,可以部分減少資料訪問次數。
full scan on null key:子查詢中的一種優化方式,主要在遇到無法通過索引訪問null值的使用。
range checked for each record (index map: n):通過 mysql 官方手冊的描述,當 mysql query optimizer 沒有發現好的可以使用的索引時,如果發現前面表的列值已知,部分索引可以使用。對前面表的每個行組合,mysql檢查是否可以使用range或 index_merge訪問方法來索取行。
select tables optimized away:當我們使用某些聚合函式來訪問存在索引的某個欄位時,mysql query optimizer 會通過索引直接一次定位到所需的資料行完成整個查詢。當然,前提是在 query 中不能有 group by 操作。如使用min()或max()的時候。
MySQL 執行計畫EXPLAIN
mysql 提供了乙個 explain 命令,它可以對 select 語句進行分析,並輸出 select 執行的詳細資訊,以供開發人員針對性優化。使用explain這個命令來檢視乙個這些sql語句的執行計畫,檢視該sql語句有沒有使用上了索引,有沒有做全表掃瞄,這都可以通過explain命令來檢視。...
MySQL執行計畫EXPLAIN
結繩記事,總結,思考,方有成長 mysql執行計畫呼叫方式 explain select 執行計畫包含的資訊及解讀如下是乙個顯示執行計畫的例子 下面將詳細展示 explain 輸出的各項內容 explain select from examination order info a where a.o...
Mysql中explain命令檢視執行計畫
explain select from xx id 一組資料,表示任務被執行的順序,序號越大的任務越先執行.select type 不包含任何子查詢或union等查詢 primary 包含子查詢最外層查詢就顯示為 primary subquery 在select或 where字句中包含的查詢 der...