日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql explain 派生表_MySQL的Explain命令

發(fā)布時間:2025/3/15 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql explain 派生表_MySQL的Explain命令 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Explain命令是查看查詢優(yōu)化器如何決定執(zhí)行查詢的主要辦法。

調(diào)用 EXPLAIN

要使用EXPLAIN,只需在查詢中的SELECT關(guān)鍵字之前增加EXPLAIN。MySQL會在查詢上設(shè)置一個標(biāo)記。當(dāng)執(zhí)行查詢時,這個標(biāo)記會使其返回關(guān)于在執(zhí)行計劃中每一步的信息,而不是執(zhí)行它(一般情況下)。它會返回一行或多行信息,顯示出執(zhí)行計劃中的每一部分和執(zhí)行的次序。

explain select 1結(jié)果示例:

在查詢中每個表在輸出中只有一行。如果查詢是兩個表的連接,那么輸出中將有兩行。別名表單算為一個表。如果把一個表與自己來凝結(jié),輸出中也會有兩行。"表"意義在這里相當(dāng)廣泛:可以是一個子查詢,一個UNION結(jié)果等。

EXPLAIN 有兩個主要變種:

EXPLAIN EXTENDED。它會通知服務(wù)器"逆向編譯"執(zhí)行計劃為一個SELECT語句。可以通過緊接其后運行SHOW WARNINGS看到這個生成的語句。這個語句直接來自執(zhí)行計劃,而不是原SQL語句,到這點上已經(jīng)變成一個數(shù)據(jù)結(jié)構(gòu)。在大部分場景下它都與原語句不相同。(結(jié)果輸出添加了filterd列)

EXPLAIN PARTITIONS。它會顯示查詢將訪問的分區(qū),如果查詢是基于分區(qū)表的話。 (結(jié)果輸出添加了partitions列)

認為增加EXPLAIN時,MySQL不會執(zhí)行查詢,這是一個常見錯誤。如果查詢在FROM子句中包括子查詢,那么MySQL實際上會執(zhí)行子查詢,將其結(jié)果放在一個臨時表中,然后完成外層查詢優(yōu)化。它必須在可以完成外層查詢優(yōu)化之前處理所有類似的子查詢。

EXPLAIN只是一個近似結(jié)果。以下有一些相關(guān)的限制:

EXPLAIN不會告訴你觸發(fā)器、存儲過程或UDF會如何影響查詢。

EXPLAIN 不支持存儲過程,盡管可以手動抽取查詢并單獨對其進行EXPLAIN操作。

EXPLAIN不會告訴你MySQL在查詢執(zhí)行中所做的特定優(yōu)化。

EXPLAIN不會顯示關(guān)于查詢的執(zhí)行計劃的所有信息。

EXPLAIN不區(qū)分具有相同名字的事物。例如,它對內(nèi)存排序和臨時文件都使用"filesort",并且對于磁盤上和內(nèi)存中的臨時表都顯示"Using temporary"。

EXPLAIN 中的列

explain的輸出的列包括:id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra等。

id 列

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

MySQL將SELECT查詢分為簡單和復(fù)雜類型,復(fù)雜類型可分為三大類:簡單子查詢、所謂的派生表(在FROM子句中的子查詢),以及UNION查詢。

注意UNION結(jié)果輸出中的額外行。UNION結(jié)果總是放在一個匿名臨時表中,之后MySQL將結(jié)果讀取到臨時表外。臨時表并不在原SQL中出現(xiàn),因此它的id列是NULL。

select_type 列

這一列顯示了對應(yīng)行是簡單還是復(fù)雜select。值如下:

SIMPLE

該查詢不包括子查詢和UNION。

PRIMARY

復(fù)雜SELECT的最外層行。

SUBQUERY

包含在SELECT 列表中的子查詢中的select(簡單子查詢)。

SUBQUERY還可被標(biāo)記為DEPENDENT,DEPENDENT SUBQUERY 意味著SELECT依賴于外層查詢中發(fā)現(xiàn)的數(shù)據(jù)。

DERIVED

包含在FROM子句的子查詢中的SELECT 。

MySQL會遞歸執(zhí)行并將結(jié)果放到一個臨時表中。服務(wù)器內(nèi)部稱其"派生表",因為該臨時表是從子查詢中派生出來的。

UNION

在UNION中的第二個和隨后的SELECT 。

第一個SELECT被標(biāo)記就好像它以部分外查詢來執(zhí)行。如果UNION被FROM子句中的子查詢包含,那么它的第一個SELECT會被標(biāo)記為DERIVED 。

UNION還可被標(biāo)記為UNCACHEABLE。UNCACHEABLE UNION 意味著SELECT中的某些特性阻止結(jié)果被緩存與一個Item_cache中。

UNION RESULT

用來從UNION的匿名臨時表檢索結(jié)果的SELECT。

table 列

這一列顯示對應(yīng)行正在訪問哪個表。可以在這一列中從上往下觀察MySQL的關(guān)聯(lián)優(yōu)化器為查詢選擇的關(guān)聯(lián)順序。

查詢執(zhí)行計劃于EXPLAIN中的行相對應(yīng)的方式:

派生表和聯(lián)合

當(dāng)FROM子句中有子查詢或有UNION時,table列會變得復(fù)雜得多。在這些場景下,確實沒有一個"表"可以參考到,因為MySQL創(chuàng)建的匿名臨時表僅在查詢執(zhí)行過程中存在。

當(dāng)在FROM子句中有子查詢時,table列是的形式,其中N是子查詢的id。這總是"向前引用"。換言之,N指向EXPLAIN輸出中后面的一行。

當(dāng)有UNION時,UNION RESULT的table列包含一個參與UNION的id列表。這總是"向后引用",因為UNION RESULT出現(xiàn)在UNION中所有參與行之后。

type 列

type列顯示MySQL的訪問類型,即MySQL決定如何查找表中的行。下面是重要的訪問方法,依次從最差到最優(yōu):

ALL

全表掃描,通常意味著MySQL必須掃描整張表,從頭到尾,去找到需要的行。

這里也有個例外,例如在查詢里使用了LIMIT,或者在Extra列中顯示"Using distinct/not exists"。

index

這個跟全表掃描一樣,只是MySQL掃描表是按索引次序進行而不是行。它的主要優(yōu)點是避免了排序;最大的缺點是要承擔(dān)按索引次序讀取整個表的開銷。這通常意味著若是按隨機次序訪問行,開銷將會非常大。

如果在Extra列種看到"Using index",說明MySQL正在使用覆蓋索引,它只掃描索引的數(shù)據(jù),而不是按索引次序的每一行。它比按索引次序全表掃描的開銷要少很多。

range

范圍掃描時一個有限制的索引掃描,它開始于索引里的某一點,返回匹配這個值域的行。

這比全索引掃描好一些,因為它用不著遍歷全部索引。顯而易見的范圍掃描是帶有BETWEEN或在WHERE子句里帶有>的查詢。

當(dāng)MySQL使用索引去查找一系列值時,例如IN()和OR列表,也會顯示為范圍掃描。然而,這兩者其實是相當(dāng)不同的訪問類型,在性能上有主要的差異。

此類掃描的開銷跟索引類型相當(dāng)。

ref

這是一種索引訪問(有時也叫做索引查找),它返回所有匹配某個單個值得行。然而,它可能會找到多個符合條件的行,因此,它是查找和掃描的混合體。此類索引訪問只有當(dāng)使用非唯一性索引或者唯一性索引的非唯一性前綴才會發(fā)生。把它叫做ref是因為索引要跟某個參考值相比較。這個參考值或者是一個常數(shù),或者是來自多表查詢前一個表里的結(jié)果值。

ref_or_null是ref之上的一個變體,它意味著MySQL必須在初次查找的結(jié)果。

eq_ref

使用這種索引查找,MySQL知道最多只返回一條符合條件的記錄。

這種訪問方法可以在MySQL使用主鍵或者唯一性索引查找時看到,它會將他們與某個參考值作比較。MySQL對于這類訪問類型的優(yōu)化坐的非常好,因為它知道無需估計匹配行的范圍或在找到匹配行后再繼續(xù)查找。

const, system

當(dāng)MySQL能對查詢的某部分進行優(yōu)化并將其轉(zhuǎn)換成一個常量時,它就會使用這些訪問類型。

例如,如果你通過將某一行的主鍵放入where子句里的方式來選取此行的主鍵,MySQL就能把這個查詢轉(zhuǎn)換為一個常量。然后就可以高效地將表從聯(lián)接執(zhí)行中移除。

NULL

這種訪問方式意味著MySQL能在優(yōu)化階段分解查詢語句,在執(zhí)行階段甚至用不著再訪問表或者索引。

例如,從一個索引列里選取最小值可以通過單獨查找索引來完成,不需要執(zhí)行時訪問表。

possible_key 列

這一列顯示了查詢可以使用哪些索引,這是基于查詢訪問的列和使用的比較操作符來判斷的。這個列表是在優(yōu)化過程的早期創(chuàng)建的,因此有些羅列出來的索引可能對于后續(xù)優(yōu)化過程是沒用的。

key 列

這一列顯示了MySQL決定采用哪個索引來優(yōu)化對該表的訪問。如果該索引沒有出現(xiàn)在possible_key列中,那么MySQL選用它是處于另外的原因。例如,它可能選擇了一個覆蓋索引,哪怕沒有WHERE子句。

possible_key揭示了哪一個索引能有助于高效地行查找,而key顯示的是優(yōu)化采用哪一個索引可以最小化查找成本。

key_len 列

這列顯示了MySQL在索引里使用的字節(jié)數(shù)。如果MySQL正在使用的只是索引里的某些列,那么就可以這這個值來算出具體是哪些列。

key_len 列顯示了在索引字段中可能的最大長度,而不是表中數(shù)據(jù)使用的實際字節(jié)數(shù)。

ref 列

這一列顯示了之前的表在key列記錄的索引中查找值所用的列或常量。

rows 列

這一列是MySQL估計為了找到所需的行而要讀取的行數(shù)。這個數(shù)據(jù)是內(nèi)嵌循環(huán)關(guān)聯(lián)計劃里的循環(huán)數(shù)目。也就是說它不是MySQL認為它最終要從表里讀取出來的行數(shù),而是MySQL為了找到符合查詢的每一點上標(biāo)準(zhǔn)的那些行而必須讀取的行的平均數(shù)。(這個標(biāo)準(zhǔn)包括SQL里給定的條件,以及來自聯(lián)接次序上前一個表的當(dāng)前列)。

這個數(shù)字是MySQL認為它要檢查的行數(shù),而不是結(jié)果集里的行數(shù)。

Extra 列

這一列包含的是不適合在其他列顯示的額外信息。常見的最重要的值如下:

Using index

此值表示MySQL將使用覆蓋索引,以避免訪問表。不要把覆蓋索引和index訪問類型混淆。

Using where

這意味著MySQL服務(wù)器將在存儲引擎檢索行后再進行過濾。許多where條件里涉及索引中的列,當(dāng)(并且如果)它讀取索引時,就能被存儲引擎檢驗,因此不是所有帶where子句的查詢都會顯示"Using where"。有時"Using where"的出現(xiàn)就是一個暗示:查詢可受益于不同的索引。

Using temporary

這意味著MySQL在對查詢結(jié)果排序時會使用一個臨時表。

Using filesort

這意味著MySQL會對結(jié)果使用一個外部索引排序,而不是按索引次序從表里讀取行。MySQL有兩種文件排序算法。兩種方式都可以在內(nèi)存或磁盤上完成。但EXPLAIN無法知曉MySQL將使用哪一種文件排序,也不會告訴你排序會在內(nèi)存里還是磁盤上完成。

Range checked for each record(index map: N)

這個值意味著沒有好用的索引,新的索引將在聯(lián)接的每一行上重新估算。N是顯示在possible_keys列種索引的位圖,并且是冗余的。

filtered 列

這一列在使用EXPLAIN EXTENDED時出現(xiàn)。它顯示的是針對表里符合某個條件(where子句或聯(lián)接條件)的記錄數(shù)的百分比所做的一個悲觀估算。如果將rows列和這個百分比相乘,就能看到MySQL估算它將和查詢計劃里前一個表關(guān)聯(lián)的行數(shù)。

總結(jié)

以上是生活随笔為你收集整理的mysql explain 派生表_MySQL的Explain命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av私库在线观看 | 五月综合激情 | 播放毛片| 日韩精品一区二区三区中文在线 | www欧美精品| 免费看女人裸体 | 色一区二区三区四区 | 精品久久久无码中文字幕 | 中文字幕有码无码人妻av蜜桃 | 亚洲天堂中文字幕在线观看 | 久久爱成人| 九九热视频这里只有精品 | 农村妇女毛片精品久久久 | 爱情岛亚洲首页论坛 | 日本吃奶摸下激烈网站动漫 | 在线亚洲一区 | 韩国三级在线播放 | 欧美性大战xxxxx久久久 | 国产做受视频 | 国产又粗又猛又爽又黄又 | 天天看天天摸天天操 | 欧美影院久久 | 日韩欧美亚洲 | 国产精品污www一区二区三区 | 国产自产 | 夜色综合| 黄网站色视频免费观看 | 91精品婷婷国产综合久久竹菊 | 亚洲a网站 | 91av短视频| 91麻豆国产视频 | 波多野结衣在线影院 | 国产精品一线天 | 亚洲视频四区 | 亚洲精品无人区 | 香蕉视频二区 | 欧美亚洲精品天堂 | 伊人久久中文 | 日本人妻丰满熟妇久久久久久 | 国产又大又粗又爽的毛片 | 丁香五香天堂 | 好吊操免费视频 | 国产毛片a | 亲子伦视频一区二区三区 | 91精品国产91综合久久蜜臀 | 精品国产麻豆 | 麻豆视频传媒 | 一区影视 | 四虎网站在线观看 | 免费看国产曰批40分钟粉红裤头 | 中文字幕在线视频一区 | 午夜激情视频网站 | 亚洲国产日韩欧美一区二区三区 | 女优在线观看 | 国产精品乱码一区二三区小蝌蚪 | 美女福利一区 | 极品美女av | 无码熟妇人妻av | 朝桐光在线视频 | 一级片黑人 | 免费亚洲一区 | 操操插插 | va在线播放 | 国产aaaaa毛片| 老司机激情影院 | 日韩三级黄色 | 亚洲色图插插插 | 国产精品久久久一区二区 | 超碰九七| 国产精品一区二区三区在线 | 国产精品香蕉在线 | 亚洲爽爽网| 波多野结衣一区在线 | 国产福利片在线 | 波多野结衣福利 | 潘金莲三级80分钟 | 久操视频在线观看免费 | 美女精品 | 国产91热爆ts人妖在线 | 男人天堂av电影 | 亚洲欧美高清在线 | 欧美精品成人在线 | 欧美色图13p | 一级看片| 国产福利一区二区三区在线观看 | 亚洲精品国产精华液 | 9l视频自拍蝌蚪9l视频成人 | 手机在线看片国产 | av色网站| 国产午夜精品一区二区三区欧美 | 国产精品一区二区三区线羞羞网站 | 国产一区二区精品在线观看 | 国产无码精品在线观看 | wwww欧美| 欧美日韩免费看 | 国产91香蕉 | 日日拍夜夜拍 | 天天综合亚洲 | 亚洲天堂一区在线观看 |