溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL中explain字段的作用是什么

發(fā)布時(shí)間:2021-07-13 15:33:52 來(lái)源:億速云 閱讀:235 作者:Leah 欄目:大數(shù)據(jù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)MySQL中explain字段的作用是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Explain命令是查看查詢優(yōu)化器是如何決定執(zhí)行查詢的主要方法。這個(gè)功能有局限性,并不總會(huì)說(shuō)出真相,但它的輸出是可以獲取的最好信息,值得花時(shí)間去了解,因?yàn)榭梢詫W(xué)習(xí)到查詢是如何執(zhí)行的。學(xué)會(huì)解釋explain將會(huì)幫助你了解MySQL優(yōu)化器是如何工作的。

Explain誤區(qū)跟不足

在執(zhí)行Explain時(shí)MySQL不會(huì)執(zhí)行查詢,這是一個(gè)誤區(qū)。事實(shí)上查詢中包括子查詢,那么MySQL實(shí)際上會(huì)執(zhí)行子查詢,將其結(jié)果放在一個(gè)臨時(shí)表中,然后完成外層的查詢優(yōu)化。

雖然我們調(diào)用explain可以分析sql語(yǔ)句,但要意識(shí)到分析出來(lái)的結(jié)果也是一個(gè)近似結(jié)果,別無(wú)其他。

  • explain不會(huì)告訴你觸發(fā)器,存儲(chǔ)過(guò)程如何影響查詢

  • 他不會(huì)告訴你mysql在查詢執(zhí)行中所做的特定優(yōu)化

  • 他不會(huì)顯示關(guān)于查詢的執(zhí)行計(jì)劃的所有信息

  • 他并不區(qū)分具有相同名字的事物。例如,他對(duì)內(nèi)存排序和臨時(shí)文件都使用filesort,并且對(duì)于磁盤(pán)上和內(nèi)存中的臨時(shí)表都顯示using temporary

  • 可能會(huì)誤導(dǎo)。例如,他會(huì)對(duì)一個(gè)有著很小limit的查詢顯示全索引掃描

explain列的解釋

MySQL中explain字段的作用是什么

id列

這一列總是包含一個(gè)編號(hào),標(biāo)識(shí)select所屬的行。如果在語(yǔ)句當(dāng)中沒(méi)有子查詢活聯(lián)合查詢,那么就只會(huì)有唯一的select,于是每一行在這個(gè)列中都將顯示一個(gè)1。否則,內(nèi)層的select語(yǔ)句一般會(huì)順序編號(hào),對(duì)應(yīng)于其在原始語(yǔ)句的位置

MySQL中explain字段的作用是什么

select_type列

這一列顯示了sql語(yǔ)句是簡(jiǎn)單的查詢還是復(fù)雜的查詢。

簡(jiǎn)單查詢顯示的simple,如果有子查詢或者聯(lián)合查詢則是primary

SUBQUERY

包含在SELECT列表中的子查詢中的SELECT(換句話說(shuō),不 在FROM子句中)標(biāo)記為SUBQUERY。

DERIVED

DERIVED值用來(lái)表示包含在FROM子句的子查詢中的SELECT, MySQL會(huì)遞歸執(zhí)行并將結(jié)果放到一個(gè)臨時(shí)表中。服務(wù)器內(nèi)部稱 其“派生表”,因?yàn)樵撆R時(shí)表是從子查詢中派生來(lái)的。

UNION

在UNION中的第二個(gè)和隨后的SELECT被標(biāo)記為UNION。第一 個(gè)SELECT被標(biāo)記就好像它以部分外查詢來(lái)執(zhí)行。這就是之前的例子 中在UNION中的第一個(gè)SELECT顯示為PRIMARY的原因。如果UNION被 FROM子句中的子查詢包含,那么它的第一個(gè)SELECT會(huì)被標(biāo)記 為DERIVED。

UNION RESULT

用來(lái)從UNION的匿名臨時(shí)表檢索結(jié)果的SELECT被標(biāo)記為UNION RESULT。

除了這些值,SUBQUERY和UNION還可以被標(biāo)記為DEPENDENT和 UNCACHEABLE。DEPENDENT意味著SELECT依賴于外層查詢中發(fā)現(xiàn)的數(shù) 據(jù);UNCACHEABLE意味著SELECT中的某些特性阻止結(jié)果被緩存于一 個(gè)Item_cache中。(Item_cache未被文檔記載;它與查詢緩存不是一回 事,盡管它可以被一些相同類型的構(gòu)件否定,例如RAND()函數(shù)。)

table列

顯示這一步所訪問(wèn)的數(shù)據(jù)庫(kù)中的表的名稱。

type列

這是最重要的字段之一,顯示查詢使用了何種類型。從最好到最差的連接類型依次為:

system,const,eq_ref,ref,fulltext,ref_or_null,index_merge,unique_subquery,index_subquery,range,index,ALL

  1. system
    系統(tǒng)表,表中只有一行數(shù)據(jù)

  2. const
    讀常量,最多只會(huì)有一條記錄匹配,由于是常量,實(shí)際上只需要讀一次。

  3. eq_ref
    最多只會(huì)有一條匹配結(jié)果,一般是通過(guò)主鍵或唯一鍵索引來(lái)訪問(wèn)

  4. ref
    對(duì)于來(lái)自前面表的每一行,在此表的索引中可以匹配到多行。若聯(lián)接只用到索引的最左前綴或索引不是主鍵或唯一索引時(shí),使用ref類型(也就是說(shuō),此聯(lián)接能夠匹配多行記錄)。
    ref可用于使用'='或'<=>'操作符作比較的索引列。

  5. fulltext
    使用全文索引的時(shí)候是這個(gè)類型。要注意,全文索引的優(yōu)先級(jí)很高,若全文索引和普通索引同時(shí)存在時(shí),mysql不管代價(jià),優(yōu)先選擇使用全文索引

  6. ref_or_null

跟ref類型類似,只是增加了null值的比較。實(shí)際用的不多。

eg.
SELECT * FROM ref_table
WHERE key_column=expr OR key_column IS NULL;
  1. index_merge
    表示查詢使用了兩個(gè)以上的索引,最后取交集或者并集,常見(jiàn)and ,or的條件使用了不同的索引,官方排序這個(gè)在ref_or_null之后,但是實(shí)際上由于要讀取多個(gè)索引,性能可能大部分時(shí)間都不如range

  2. unique_subquery
    用于where中的in形式子查詢,子查詢返回不重復(fù)值唯一值,可以完全替換子查詢,效率更高。
    該類型替換了下面形式的IN子查詢的ref:
    value IN (SELECT primary_key FROM single_table WHERE some_expr)

  3. index_subquery
    子查詢中的返回結(jié)果字段組合是一個(gè)索引(或索引組合),但不是一個(gè)主鍵或唯一索引

  4. range
    索引范圍查詢,常見(jiàn)于使用 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN()或者like等運(yùn)算符的查詢中。

  5. index
    索引全表掃描,把索引從頭到尾掃一遍

  6. all
    全表掃描,性能最差。

partitions

該列顯示的為分區(qū)表命中的分區(qū)情況。非分區(qū)表該字段為空(null)。

possible_keys

查詢可能使用到的索引都會(huì)在這里列出來(lái)

key

優(yōu)化器從possible_keys中選擇使用的索引。

key_len

查詢用到的索引長(zhǎng)度(字節(jié)數(shù))。key_len只計(jì)算where條件用到的索引長(zhǎng)度,而排序和分組就算用到了索引,也不會(huì)計(jì)算到key_len中。

ref

如果是使用的常數(shù)等值查詢,這里會(huì)顯示const,如果是連接查詢,被驅(qū)動(dòng)表的執(zhí)行計(jì)劃這里會(huì)顯示驅(qū)動(dòng)表的關(guān)聯(lián)字段,如果是條件使用了表達(dá)式或者函數(shù),或者條件列發(fā)生了內(nèi)部隱式轉(zhuǎn)換,這里可能顯示為func

rows(重要)

rows 也是一個(gè)重要的字段。這是mysql估算的需要掃描的行數(shù)(不是精確值)。

這個(gè)值非常直觀顯示 SQL 的效率好壞, 原則上 rows 越少越好.

filtered

這個(gè)字段表示存儲(chǔ)引擎返回的數(shù)據(jù)在server層過(guò)濾后,剩下多少滿足查詢的記錄數(shù)量的比例,注意是百分比,不是具體記錄數(shù)。這個(gè)字段不重要

extra

EXplain 中的很多額外的信息會(huì)在 Extra 字段顯示, 常見(jiàn)的有以下幾種內(nèi)容:

. using index : 出現(xiàn)這個(gè)說(shuō)明mysql使用了覆蓋索引,避免訪問(wèn)了表的數(shù)據(jù)行,效率不錯(cuò)。

. using where :這說(shuō)明服務(wù)器在存儲(chǔ)引擎收到行后講進(jìn)行過(guò)濾。

. using temporary :這意味著mysql對(duì)查詢結(jié)果進(jìn)行排序的時(shí)候使用了一張臨時(shí)表

. using filesort :這個(gè)說(shuō)明mysql會(huì)對(duì)數(shù)據(jù)使用一個(gè)外部的索引排序

上述就是小編為大家分享的MySQL中explain字段的作用是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI