MySQL 對Explain結果中各字段的解釋

2021-09-03 02:41:24 字數 3192 閱讀 2358

explain作為常用的sql語句優化工具,可根據其結果對sql語句進行分析優化。

explain的作用:方便我們對sql語句的優化

explain的使用方式:explain + sql語句

explain的結果:id | select_type | table | type | possible_keys | key | key_ len | ref | rows | extra

id相同:執行順序同table欄位順序由上到下;

id不相同,遞增:子查詢時,id的序號會遞增,id值越大table欄位優先順序越高,越先被執行。

id相同不同,同時存在:id相同,可以認為是一組,從上往下順序執行,在所有組中,id值越大,優先順序越高,越先執行。

******:簡單查詢,查詢中不包含子查詢和union查詢

primary:如果存在子查詢,primary就是最外層的查詢

subquery: 如果存在子查詢,subquery就是內層的子查詢

derived:在from列表中包含的子查詢被標記為derived(衍生),mysql會遞迴的執行這些子查詢,把結果放在臨時表中

union:若第二個select出現在union之後,則被標記為union;若union包含在from子句的子查詢中,外層select被標記為:derived

union result:從union表獲得結果的select

顯示所用哪張表

從最好到最差依次是:

system > const > eq_ref > ref > range > index > all

一般來說,得保證查詢至少達到range級別,最好能達到ref。

const:表示通過索引一次就找到了,const用於比較primary key或者unique索引。如將主鍵置於where列表中,mysql就能將該查詢轉化為乙個常量。

eq_ref:唯一性索引掃瞄,對於每個索引鍵,表中只有一條記錄與之匹配。常見於主鍵或唯一索引掃瞄。

ref:非唯一性索引掃瞄,返回匹配某個單獨值得所有行。

range:只檢索給定範圍的行,使用乙個索引來選擇行。key列顯示使用了哪個索引。一般就是在你的where語句中出現了between、、in等的查詢。

index:只遍歷索引數。這通常比all快,因為索引檔案通常比資料檔案小。(也就是說雖然all和index都是讀全表,但index是從索引中讀取的,而all是從硬碟中讀的)

all:遍歷全表以找到匹配的行 

顯示可能應用在這張表中的索引,乙個或多個,但不一定會被查詢實際使用 

實際使用的索引。如果為null,則沒有使用索引。查詢中若使用了覆蓋索引,則該索引僅出現在key列表中

覆蓋索引:select的資料列的字段、順序包含於所建立索引的字段、順序,只用從索引中就能夠得到,不用訪問資料行,即查詢的列要被所建立的索引覆蓋。 

表示索引中所使用的位元組數,可以通過該列計算查詢中使用的索引欄位的最大可能長度,並非實際使用長度。在不損失精確性的情況下,該值越小越好。

顯示索引的哪些列被使用了,如果可能的話,是乙個常數。哪些列或常數被用於查詢索引列上的值。

根據表統計資訊及索引選用情況,大致估算出找到所需的記錄需要的行數。優化時此值越小越好。

using filesort:說明mysql會對資料使用乙個外部的索引排序,而不是按照表內事先建立的索引順序進行讀取。出現此資訊表明排序部分出現問題,常產生於order by,需立即進行優化,如將order by後的字段順序與所建索引的順序相同,不要越級(見上圖)。

using temporary:使用了臨時表來儲存中間結果,mysql在對查詢結果排序時使用臨時表。常見於排序order by和分組查詢group by。此資訊在表資料量很大時,對效能有很大的影響,應立即進行優化。優化原理大致同上

using index:表示相應的select操作中使用了覆蓋索引,避免了訪問表的資料行,表示效率不錯。如果同時出現using where,表明索引被用來執行鍵值的查詢;若沒有,則表面索引用來讀取資料。

using where:表明使用了where過濾。

using join buffer:表明使用了連線快取。

impossible where:表明where子句的值總是false,不能用來獲取任何元組。

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

distinct:優化distinct操作,在找到第一匹配的元組後停止對相同值的查詢。

MySQL高階 EXPLAIN用法和結果分析

使用explain關鍵字可以模擬優化器執行sql查詢語句,從而知道mysql是如何處理你的sql語句的。分析你的查詢語句或是表結構的效能瓶頸。通過explain,我們可以分析出以下結果 使用方式如下 explain sql語句 explain select from t1 執行計畫包含的資訊 sel...

mysql對結果計算 MYSQL計算結果

我正在 mysql 5.0中構建乙個查詢來計算學生的學期成績.初始表 studentitemgrades 包含將用於計算最終成績的作業列表等.每項作業都有乙個possiblescore,grade和weight.計算應對所有類似加權的專案進行分組,並根據分配到期的日期範圍提供sum grade su...

EXPLAIN用法和結果分析

使用explain關鍵字可以模擬優化器執行sql查詢語句,從而知道mysql是如何處理你的sql語句的。分析你的查詢語句或是表結構的效能瓶頸。通過explain,我們可以分析出以下結果 使用方式如下 explain sql語句 explain select from t1 執行計畫包含的資訊 sel...