溫馨提示×

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

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

mysql查詢優(yōu)化explain命令是怎樣的

發(fā)布時(shí)間:2021-11-11 17:19:37 來源:億速云 閱讀:122 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)mysql查詢優(yōu)化explain命令是怎樣的,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

mysql查詢優(yōu)化的方法有很多種,explain是工作當(dāng)中用的比較多的一種檢查方式。explain翻譯即解釋,就是看mysql語句的查詢解釋計(jì)劃,從解釋計(jì)劃我們能很清楚的看到解釋的語句有沒有合理用到索引,掃描了多少行數(shù),有沒有觸及全表掃描、用到臨時(shí)表等影響慢查詢的原因。

使用很簡單,如

explain select * from user ...

執(zhí)行后會(huì)出現(xiàn)解釋計(jì)劃的表格,意義可參考下面的參數(shù),針對(duì)這些解釋計(jì)劃,我們可以作為相對(duì)應(yīng)的優(yōu)化。

mysql查詢優(yōu)化explain命令是怎樣的

id    mysql查詢標(biāo)識(shí)符,即序號(hào)。

select_type    查詢類型

  • simple:即簡單select 查詢,不包含union及子查詢;

  • primary:最外層的 select 查詢;

  • union:表示此查詢是 union 的第二或隨后的查詢;

  • dependent union:union 中的第二個(gè)或后面的查詢語句, 取決于外面的查詢;

  • union result:union的結(jié)果;

  • subquery:子查詢中的第一個(gè)select;

  • dependent subquery:子查詢中的第一個(gè)select,取決于外面的查詢,即子查詢依賴于外層查詢的結(jié)果。

table    所有查詢到的表。

type    聯(lián)接類型,比較重要的項(xiàng),從這一項(xiàng)可以看出是否高效的重要依據(jù)

性能從好到壞依次如下:

  • system:表中只有一條數(shù)據(jù),這是一個(gè)特殊的const 類型;

  • const:針對(duì)主鍵或唯一索引的等值查詢掃描,最多只返回一行數(shù)據(jù),const 查詢速度非常快,因?yàn)樗鼉H僅讀取一次即可;

  • eq_ref:此類型通常出現(xiàn)在多表的 join 查詢,表示對(duì)于前表的每一個(gè)結(jié)果,都只能匹配到后表的一行結(jié)果,并且查詢的比較操作通常是=, 查詢效率較高;

  • ref:此類型通常出現(xiàn)在多表的 join 查詢, 針對(duì)于非唯一或非主鍵索引, 或者是使用了 最左前綴 規(guī)則索引的查詢;

  • fulltext:全文索引檢索,要注意,全文索引的優(yōu)先級(jí)很高,若全文索引和普通索引同時(shí)存在時(shí),mysql不管代價(jià),優(yōu)先選擇使用全文索引;

  • ref_or_null:與ref方法類似,只是增加了null值的比較。實(shí)際用的不多;

  • unique_subquery:用于where中的in形式子查詢,子查詢返回不重復(fù)值唯一值;

  • index_subquery:用于in形式子查詢使用到了輔助索引或者in常數(shù)列表,子查詢可能返回重復(fù)值,可以使用索引將子查詢?nèi)ブ兀?/p>

  • index_merge:表示查詢使用了兩個(gè)以上的索引,最后取交集或者并集,常見and,or的條件使用了不同的索引,官方排序這個(gè)在ref_or_null之后,但是實(shí)際上由于要讀取所個(gè)索引,性能可能大部分時(shí)間都不如range;

  • range:表示使用索引范圍查詢,通過索引字段范圍獲取表中部分?jǐn)?shù)據(jù)記錄。這個(gè)類型通常出現(xiàn)在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN操作中,此時(shí)輸出的 ref 字段為 NULL并且key_len字段是此次查詢中使用到的索引的最長的那個(gè);

  • index:全表掃描,只是掃描表的時(shí)候按照索引次序進(jìn)行而不是行。主要優(yōu)點(diǎn)就是避免了排序,但是開銷仍然非常大,這種情況時(shí), Extra 字段會(huì)顯示 Using index;

  • all:性能最差的情況,使用了全表掃描,系統(tǒng)必須避免出現(xiàn)這種情況。

possible_keys    可能用到的索引。

key    真正用到的索引。

key_len    使用了索引字節(jié)的長度。

ref  顯示索引的哪一列被使用了。

rows    掃描了多少行數(shù),也是性能評(píng)估的重要依據(jù)。

extra 額度信息,常見的有以下幾種。  

  • Distinct:一旦找到了與行相聯(lián)合匹配的行就不再搜索了;

  • Using filesort:使用了文件排序,性能非常慢,需要優(yōu)化。

  • Using index:查詢使用到了索引,列數(shù)據(jù)是從僅僅使用了索引中的信息而沒有讀取實(shí)際的行動(dòng)的表返回的,這發(fā)生在對(duì)表的全部的請(qǐng)求列都是同一個(gè)索引的部分的時(shí)候。

  • Using temporary:使用了臨時(shí)表排序,性能非常慢,需要優(yōu)化。

  • Using where:表示使用了where進(jìn)行查詢,不是很重要。

  • ALL:這個(gè)連接類型對(duì)于前面的每一個(gè)記錄聯(lián)合進(jìn)行完全掃描,這一般比較糟糕,需要優(yōu)化。

以上就是mysql查詢優(yōu)化explain命令是怎樣的,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

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

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

AI