下文主要給大家?guī)?lái)MySQL中Explain的詳細(xì)用法有哪些,希望MySQL中Explain的詳細(xì)用法有哪些能夠帶給大家實(shí)際用處,這也是我編輯這篇文章的主要目的。好了,廢話不多說(shuō),大家直接看下文吧。
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出芷江免費(fèi)做網(wǎng)站回饋大家。
、
執(zhí)行計(jì)劃(query Execution plan)
語(yǔ)法
explain select * from table
explain 中的列
expain出來(lái)的信息有10列,
分別是id,select_type,table、type,partitions,possible_keys,key,key_len,ref,rows,Extra,下面對(duì)這些字段出現(xiàn)的可能進(jìn)行解釋:
一、ID
SQL執(zhí)行的順序的標(biāo)識(shí),SQL從大到小的執(zhí)行
1、ID相同時(shí),執(zhí)行順序由上至下
2、如果是子查詢,ID的序號(hào)會(huì)遞增,ID值越大優(yōu)先級(jí)越高,越先被執(zhí)行
3、ID如果相同,可以認(rèn)為是一組,從上往下順序執(zhí)行;在所有組中,ID值越大,優(yōu)先級(jí)越高,越先執(zhí)行
二、select_type
示查詢中每個(gè)select子句的類型
1、SIMPLE:簡(jiǎn)單的SELECT,不實(shí)用UNION或者子查詢。
2、PRIMARY:最外層SELECT。
3、UNION:第二層,在SELECT之后使用了UNION。
4、DEPENDENT UNION:UNION語(yǔ)句中的第二個(gè)SELECT,依賴于外部子查詢。
5、UNION RESULT:UNION的結(jié)果。
6、SUBQUERY:子查詢中的第一個(gè)SELECT。
7、DEPENDENT SUBQUERY:子查詢中的第一個(gè)SELECT,取決于外面的查詢。
8、DERIVED:導(dǎo)出表的SELECT(FROM子句的子查詢)
9、MATERIALIZED:物化子查詢
10、UNCACHEABLE SUBQUERY:無(wú)法緩存結(jié)果的子查詢,必須為外部查詢的每一行重新計(jì)算
11、UNCACHEABLE UNION:UNION 屬于不可緩存的子查詢的第二個(gè)或后一個(gè)選擇
三、table
輸出行引用的表的名稱。這也可以是以下值之一:
<unionM,N,...>:該行指的是id值為M和id值為N的并集。
<derivedN>:該行是指用于與該行的派生表結(jié)果id的值 N。例如,派生表可以來(lái)自FROM子句中的子查詢
<subqueryN>:該行指的是id 值為的行的具體化子查詢的結(jié)果N
四、type
表示MySQL在表中找到所需行的方式,又稱“訪問(wèn)類型”。
常用的類型有: NULL, system, const, eq_ref, ref, range, index, ALL(從左到右,性能從差到好)
以下列表描述了從最佳類型到最差類型的連接類型
NULL
MySQL在優(yōu)化過(guò)程中分解語(yǔ)句,執(zhí)行時(shí)甚至不用訪問(wèn)表或索引,例如從一個(gè)索引列里選取最小值可以通過(guò)單獨(dú)索引查找完成。
system
該表只有一行(如:系統(tǒng)表)。這是const連接類型的特例
const
該表最多只有一個(gè)匹配行,在查詢開(kāi)頭讀取。因?yàn)橹挥幸恍?,所以?yōu)化器的其余部分可以將此行中列的值視為常量。 const表非??欤?yàn)樗鼈冎蛔x一次。
SELECT * FROM tbl_name WHERE primary_key=1; SELECT * FROM tbl_name WHERE primary_key_part1=1 AND primary_key_part2=2;
eq_ref
對(duì)于前面表格中的每個(gè)行組合,從該表中讀取一行。除了 system和 const類型之外,這是最好的連接類型。當(dāng)連接使用索引的所有部分且索引是 索引PRIMARY KEY或UNIQUE NOT NULL索引時(shí)使用它。
SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column; SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;
ref
表示上述表的連接匹配條件,即哪些列或常量被用于查找索引列上的值
fulltext
使用FULLTEXT 索引執(zhí)行連接。
ref_or_null
SELECT * FROM ref_table WHERE key_column IS NULL;
index_merge
該指數(shù)合并訪問(wèn)方法檢索與多行 range掃描和他們的結(jié)果合并到一個(gè)。此訪問(wèn)方法僅合并來(lái)自單個(gè)表的索引掃描,而不掃描多個(gè)表。合并可以生成其基礎(chǔ)掃描的聯(lián)合,交叉或交叉聯(lián)合
SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20; SELECT * FROM tbl_name WHERE (key1 = 10 OR key2 = 20) AND non_key = 30; SELECT * FROM t1, t2 WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%') AND t2.key1 = t1.some_col; SELECT * FROM t1, t2 WHERE t1.key1 = 1 AND (t2.key1 = t1.some_col OR t2.key2 = t1.some_col2);
unique_subquery
此類型替換 以下形式的eq_ref某些 IN子查詢:
value IN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery
此連接類型類似于 unique_subquery。它替換IN子查詢,但它適用于以下形式的子查詢中的非唯一索引:
value IN (SELECT key_column FROM single_table WHERE some_expr)
range
僅檢索給定范圍內(nèi)的行,使用索引選擇行。的key 輸出行中的列指示使用哪個(gè)索引。將key_len包含已使用的時(shí)間最長(zhǎng)的關(guān)鍵部分。該ref列 NULL適用于此類型。
range當(dāng)一個(gè)鍵柱使用任何的相比于恒定可使用 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE,或 IN()運(yùn)營(yíng)商:
index
該index聯(lián)接類型是一樣的 ALL,只是索引樹(shù)被掃描。這種情況有兩種:
1、如果索引是查詢的覆蓋索引,并且可用于滿足表中所需的所有數(shù)據(jù),則僅掃描索引樹(shù)。在這種情況下,Extra專欄說(shuō) Using index。僅索引掃描通常比ALL索引的大小通常小于表數(shù)據(jù)更快 。
2、使用索引中的讀取執(zhí)行全表掃描,以按索引順序查找數(shù)據(jù)行。 Uses index沒(méi)有出現(xiàn)在 Extra列中。當(dāng)查詢僅使用屬于單個(gè)索引的列時(shí),MySQL可以使用此連接類型。
ALL
對(duì)前面表格中的每個(gè)行組合進(jìn)行全表掃描。如果表是第一個(gè)未標(biāo)記的表 const,通常不好,并且在所有其他情況下通常 非常糟糕。通常,您可以ALL通過(guò)添加基于常量值或早期表中的列值從表中啟用行檢索的索引來(lái)避免
五、possible_keys
該possible_keys列指示MySQL可以選擇在此表中查找行的索引,指出MySQL能使用哪個(gè)索引在表中找到記錄,查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢使用
該列完全獨(dú)立于EXPLAIN輸出所示的表的次序。這意味著在possible_keys中的某些鍵實(shí)際上不能按生成的表次序使用。
如果該列是NULL,則沒(méi)有相關(guān)的索引。在這種情況下,可以通過(guò)檢查WHERE子句看是否它引用某些列或適合索引的列來(lái)提高你的查詢性能。如果是這樣,創(chuàng)造一個(gè)適當(dāng)?shù)乃饕⑶以俅斡肊XPLAIN檢查查詢
六、Key
key列顯示MySQL實(shí)際決定使用的鍵(索引)
如果沒(méi)有選擇索引,鍵是NULL。要想強(qiáng)制MySQL使用或忽視possible_keys列中的索引,在查詢中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
七、key_len
表示索引中使用的字節(jié)數(shù),可通過(guò)該列計(jì)算查詢中使用的索引的長(zhǎng)度(key_len顯示的值為索引字段的最大可能長(zhǎng)度,并非實(shí)際使用長(zhǎng)度,即key_len是根據(jù)表定義計(jì)算而得,不是通過(guò)表內(nèi)檢索出的)
不損失精確性的情況下,長(zhǎng)度越短越好
八、ref
表示上述表的連接匹配條件,即哪些列或常量被用于查找索引列上的值
九、rows
表示MySQL根據(jù)表統(tǒng)計(jì)信息及索引選用情況,估算的找到所需的記錄所需要讀取的行數(shù)
十、Extra
該Extra列 EXPLAIN輸出包含MySQL解決查詢的額外信息。以下列表說(shuō)明了此列中可能出現(xiàn)的值。每個(gè)項(xiàng)目還指示JSON格式的輸出哪個(gè)屬性顯示Extra值。對(duì)于其中一些,有一個(gè)特定的屬性。其他顯示為message 屬性的文本
十一、partitions(擴(kuò)展)
記錄將與查詢匹配的分區(qū)。僅在使用PARTITIONS關(guān)鍵字時(shí)才顯示此列 。非分區(qū)表顯示null
對(duì)于以上關(guān)于MySQL中Explain的詳細(xì)用法有哪些,大家是不是覺(jué)得非常有幫助。如果需要了解更多內(nèi)容,請(qǐng)繼續(xù)關(guān)注我們的行業(yè)資訊,相信你會(huì)喜歡上這些內(nèi)容的。
本文題目:MySQL中Explain的詳細(xì)用法有哪些
文章路徑:http://chinadenli.net/article0/gjsdoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、虛擬主機(jī)、響應(yīng)式網(wǎng)站、靜態(tài)網(wǎng)站、Google、App開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)