mysql優化之EXPLAIN語句

2021-09-30 15:25:41 字數 2481 閱讀 7795

explaintbl_name 或:

explain [extended] selectselect_options

explain語句可以用作describe的乙個同義詞,或獲得關於mysql如何執行select語句的資訊:

借助於這個語句,我們也可以分析出,索引對於查詢的作用,以及何時應該可以資料表新增什麼樣的索引。

show warnings

語句來檢視。

system,表中僅有一行資料(=系統表),在下面可以看到這是屬於const聯接型別的乙個特例。如我資料表中只有一條記錄,在執行explain select name from i_node;後,可以發現結果中的type資料項值為system.

const表最多有乙個匹配行,它將在查詢開始時被讀取.一般情況下,const用於用常數值比較primary key或unique欄位的值。

eq_ref對於每個來自於前面的表的行組合,從該表中讀取一行。這可能是最好的聯接型別,除了const型別。它用在乙個索引的所有部分被聯接使用並且索引是unique或primary key,eq_ref可以用於使用= 操作符比較的帶索引的列。比較值可以為常量或乙個使用在該錶前面所讀取的表的列的表示式。可以按照這種聯接型別優化查詢。

ref對於每個來自於前面的表的行組合,所有有匹配索引值的行將從這張表中讀取。如果聯接只使用鍵的最左邊的字首,或如果鍵不是unique或primary key(換句話說,如果聯接不能基於關鍵字選擇單個行的話),則使用ref。如果使用的鍵僅僅匹配少量行,該聯接型別是不錯的。

ref_or_null該聯接型別如同ref,但是新增了mysql可以專門搜尋包含null值的行。在解決子查詢中經常使用該聯接型別的優化。

index_merge該聯接型別表示使用了索引合併優化方法。在這種情況下,key列包含了使用的索引的清單,key_len包含了使用的索引的最長的關鍵元素。

unique_subquery 該型別替換了下面形式的in子查詢的ref:

value in (select primary_keyfrom single_table where some_expr)

index_subquery 該聯接型別類似於unique_subquery。可以替換in子查詢,但只適合下列形式的子查詢中的非唯一索引

value in (select key_columnfrom single_table where some_expr)

range只檢索給定範圍的行,使用乙個索引來選擇行。key列顯示使用了哪個索引。key_len包含所使用索引的最長關鍵元素。在該型別中ref列為null。當使用=、<>、>、>=、<、<=、is null、<=>、between或者in操作符,用常量比較關鍵字列時,可以使用range。

index該聯接型別與all相同,除了只有索引樹被掃瞄。這通常比all快,因為索引檔案通常比資料檔案小。當查詢只使用作為單索引一部分的列時,mysql可以使用該聯接型別。

all對於每個來自於先前的表的行組合,進行完整的表掃瞄。如果表是第乙個沒標記const的表,這通常不好,並且通常在它情況下差。通常可以增加更多的索引而不要使用all,使得行能基於前面的表中的常數值或列值被檢索出。

not exists mysql能夠對查詢進行left join優化,發現1個匹配left join標準的行後,不再為前面的的行組合在該錶內檢查更多的行。

using filesort mysql需要額外的一次傳遞,以找出如何按排序順序檢索行。通過根據聯接型別瀏覽所有行並為所有匹配where子句的行儲存排序關鍵字和行的指標來完成排序。然後關鍵字被排序,並按排序順序檢索行。。

using index從只使用索引樹中的資訊而不需要進一步搜尋讀取實際的行來檢索表中的列資訊。當查詢只使用作為單一索引一部分的列時,可以使用該策略。

using temporary為了解決查詢,mysql需要建立乙個臨時表來容納結果。典型情況如查詢包含可以按不同情況列出列的group by和order by子句時。

using wherewhere子句用於限制哪乙個行匹配下乙個表或傳送到客戶。除非你專門從表中索取或檢查所有行,如果extra值不為using where並且表聯接型別為all或index,查詢可能會有一些錯誤。

using sort_union(...), using union(...), usingintersect(...) 這些函式說明如何為index_merge聯接型別合併索引掃瞄。

using index for group-by 類似於訪問表的using index方式,using index for group-by表示mysql發現了乙個索引,可以用來查詢group by或distinct查詢的所有列,而不要額外搜尋硬碟訪問實際的表。並且,按最有效的方式使用索引,以便對於每個組,只讀取少量索引條目。

explain語句可以很好的幫助檢查優化器的操作過程,至少可以用於下列用途:

讓我們知道以不同的方式編寫出來的查詢命令是否會影響到索引的使用。

在給資料表增加索引後,對優化器生成高效執行計畫的能力會產生什麼樣的影響。

在發現慢查詢之後,用語句對查詢進行分析,幫助發現慢查詢的原因。

mysql效能優化之EXPLAIN

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

MySQL效能優化之explain

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

MySQL 優化之 EXPLAIN 關鍵字

mysql查詢優化之explain的深入解析 首先執行如下的 sql 語句 create table ifnot exists article id int 10 unsigned not null auto increment,author id int 10 unsigned not null,...