chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

全網(wǎng)最全面、最細(xì)致的EXPLAIN解讀

數(shù)據(jù)分析與開(kāi)發(fā) ? 來(lái)源:數(shù)據(jù)分析與開(kāi)發(fā) ? 作者:數(shù)據(jù)分析與開(kāi)發(fā) ? 2020-10-30 16:39 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

EXPLAIN作為MySQL的性能分析神器,讀懂其結(jié)果是很有必要的,然而我在各種搜索引擎上竟然找不到特別完整的解讀。都是只有重點(diǎn),沒(méi)有細(xì)節(jié)(例如type的取值不全、Extra缺乏完整的介紹等)。

所以,我肝了將近一個(gè)星期,整理了一下。這應(yīng)該是全網(wǎng)最全面、最細(xì)致的EXPLAIN解讀文章了,下面是全文。

文章比較長(zhǎng),建議收藏。

TIPS

本文基于MySQL 8.0編寫(xiě),理論支持MySQL 5.0及更高版本。

EXPLAIN使用

explain可用來(lái)分析SQL的執(zhí)行計(jì)劃。格式如下:

{EXPLAIN | DESCRIBE | DESC} tbl_name [col_name | wild] {EXPLAIN | DESCRIBE | DESC} [explain_type] {explainable_stmt | FOR CONNECTION connection_id} {EXPLAIN | DESCRIBE | DESC} ANALYZE select_statement explain_type: { FORMAT = format_name} format_name: { TRADITIONAL | JSON | TREE} explainable_stmt: { SELECT statement | TABLE statement | DELETE statement | INSERT statement | REPLACE statement | UPDATE statement}

示例:

EXPLAIN format = TRADITIONAL json SELECT tt.TicketNumber, tt.TimeIn, tt.ProjectReference, tt.EstimatedShipDate, tt.ActualShipDate, tt.ClientID, tt.ServiceCodes, tt.RepetitiveID, tt.CurrentProcess, tt.CurrentDPPerson, tt.RecordVolume, tt.DPPrinted, et.COUNTRY, et_1.COUNTRY, do.CUSTNAME FROM tt, et, et AS et_1, do WHERE tt.SubmitTime IS NULL AND tt.ActualPC = et.EMPLOYID AND tt.AssignedPC = et_1.EMPLOYID AND tt.ClientID = do.CUSTNMBR;

結(jié)果輸出展示:

字段 format=json時(shí)的名稱 含義
id select_id 該語(yǔ)句的唯一標(biāo)識(shí)
select_type 無(wú) 查詢類型
table table_name 表名
partitions partitions 匹配的分區(qū)
type access_type 聯(lián)接類型
possible_keys possible_keys 可能的索引選擇
key key 實(shí)際選擇的索引
key_len key_length 索引的長(zhǎng)度
ref ref 索引的哪一列被引用了
rows rows 估計(jì)要掃描的行
filtered filtered 表示符合查詢條件的數(shù)據(jù)百分比
Extra 沒(méi)有 附加信息

結(jié)果解讀

id

該語(yǔ)句的唯一標(biāo)識(shí)。如果explain的結(jié)果包括多個(gè)id值,則數(shù)字越大越先執(zhí)行;而對(duì)于相同id的行,則表示從上往下依次執(zhí)行。

select_type

查詢類型,有如下幾種取值:

查詢類型 作用
SIMPLE 簡(jiǎn)單查詢(未使用UNION或子查詢)
PRIMARY 最外層的查詢
UNION 在UNION中的第二個(gè)和隨后的SELECT被標(biāo)記為UNION。如果UNION被FROM子句中的子查詢包含,那么它的第一個(gè)SELECT會(huì)被標(biāo)記為DERIVED。
DEPENDENT UNION UNION中的第二個(gè)或后面的查詢,依賴了外面的查詢
UNION RESULT UNION的結(jié)果
SUBQUERY 子查詢中的第一個(gè) SELECT
DEPENDENT SUBQUERY 子查詢中的第一個(gè) SELECT,依賴了外面的查詢
DERIVED 用來(lái)表示包含在FROM子句的子查詢中的SELECT,MySQL會(huì)遞歸執(zhí)行并將結(jié)果放到一個(gè)臨時(shí)表中。MySQL內(nèi)部將其稱為是Derived table(派生表),因?yàn)樵撆R時(shí)表是從子查詢派生出來(lái)的
DEPENDENT DERIVED 派生表,依賴了其他的表
MATERIALIZED 物化子查詢
UNCACHEABLE SUBQUERY 子查詢,結(jié)果無(wú)法緩存,必須針對(duì)外部查詢的每一行重新評(píng)估
UNCACHEABLE UNION UNION屬于UNCACHEABLE SUBQUERY的第二個(gè)或后面的查詢

table

表示當(dāng)前這一行正在訪問(wèn)哪張表,如果SQL定義了別名,則展示表的別名

partitions

當(dāng)前查詢匹配記錄的分區(qū)。對(duì)于未分區(qū)的表,返回null

type

連接類型,有如下幾種取值,性能從好到壞排序如下:

1 system:該表只有一行(相當(dāng)于系統(tǒng)表),system是const類型的特例

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

3 eq_ref:當(dāng)使用了索引的全部組成部分,并且索引是PRIMARY KEY或UNIQUE NOT NULL 才會(huì)使用該類型,性能僅次于system及const。

-- 多表關(guān)聯(lián)查詢,單行匹配SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column; -- 多表關(guān)聯(lián)查詢,聯(lián)合索引,多行匹配SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;

4 ref:當(dāng)滿足索引的最左前綴規(guī)則,或者索引不是主鍵也不是唯一索引時(shí)才會(huì)發(fā)生。如果使用的索引只會(huì)匹配到少量的行,性能也是不錯(cuò)的。

-- 根據(jù)索引(非主鍵,非唯一索引),匹配到多行SELECT * FROM ref_table WHERE key_column=expr; -- 多表關(guān)聯(lián)查詢,單個(gè)索引,多行匹配SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column; -- 多表關(guān)聯(lián)查詢,聯(lián)合索引,多行匹配SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;

TIPS

最左前綴原則,指的是索引按照最左優(yōu)先的方式匹配索引。比如創(chuàng)建了一個(gè)組合索引(column1, column2, column3),那么,如果查詢條件是:

?WHERE column1 = 1、WHERE column1= 1 AND column2 = 2、WHERE column1= 1 AND column2 = 2 AND column3 = 3 都可以使用該索引;?WHERE column2 = 2、WHERE column2 = 1 AND column3 = 3就無(wú)法匹配該索引。

5 fulltext:全文索引

6 ref_or_null:該類型類似于ref,但是MySQL會(huì)額外搜索哪些行包含了NULL。這種類型常見(jiàn)于解析子查詢

SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;

7 index_merge:此類型表示使用了索引合并優(yōu)化,表示一個(gè)查詢里面用到了多個(gè)索引

8 unique_subquery:該類型和eq_ref類似,但是使用了IN查詢,且子查詢是主鍵或者唯一索引。例如:

value IN (SELECT primary_key FROM single_table WHERE some_expr)

9 index_subquery:和unique_subquery類似,只是子查詢使用的是非唯一索引

value IN (SELECT key_column FROM single_table WHERE some_expr)

10 range:范圍掃描,表示檢索了指定范圍的行,主要用于有限制的索引掃描。比較常見(jiàn)的范圍掃描是帶有BETWEEN子句或WHERE子句里有>、>=、<、<=、IS NULL、<=>、BETWEEN、LIKE、IN()等操作符。

SELECT * FROM tbl_name WHERE key_column BETWEEN 10 and 20; SELECT * FROM tbl_name WHERE key_column IN (10,20,30);

11 index:全索引掃描,和ALL類似,只不過(guò)index是全盤(pán)掃描了索引的數(shù)據(jù)。當(dāng)查詢僅使用索引中的一部分列時(shí),可使用此類型。有兩種場(chǎng)景會(huì)觸發(fā):

?

如果索引是查詢的覆蓋索引,并且索引查詢的數(shù)據(jù)就可以滿足查詢中所需的所有數(shù)據(jù),則只掃描索引樹(shù)。此時(shí),explain的Extra 列的結(jié)果是Using index。index通常比ALL快,因?yàn)樗饕拇笮⊥ǔP∮诒頂?shù)據(jù)。

?

按索引的順序來(lái)查找數(shù)據(jù)行,執(zhí)行了全表掃描。此時(shí),explain的Extra列的結(jié)果不會(huì)出現(xiàn)Uses index。

?

ALL:全表掃描,性能最差。

possible_keys

展示當(dāng)前查詢可以使用哪些索引,這一列的數(shù)據(jù)是在優(yōu)化過(guò)程的早期創(chuàng)建的,因此有些索引可能對(duì)于后續(xù)優(yōu)化過(guò)程是沒(méi)用的。

key

表示MySQL實(shí)際選擇的索引

key_len

索引使用的字節(jié)數(shù)。由于存儲(chǔ)格式,當(dāng)字段允許為NULL時(shí),key_len比不允許為空時(shí)大1字節(jié)。

key_len計(jì)算公式:https://www.cnblogs.com/gomysql/p/4004244.html[1]

ref

表示將哪個(gè)字段或常量和key列所使用的字段進(jìn)行比較。

如果ref是一個(gè)函數(shù),則使用的值是函數(shù)的結(jié)果。要想查看是哪個(gè)函數(shù),可在EXPLAIN語(yǔ)句之后緊跟一個(gè)SHOW WARNING語(yǔ)句。

rows

MySQL估算會(huì)掃描的行數(shù),數(shù)值越小越好。

filtered

表示符合查詢條件的數(shù)據(jù)百分比,最大100。用rows × filtered可獲得和下一張表連接的行數(shù)。例如rows = 1000,filtered = 50%,則和下一張表連接的行數(shù)是500。

TIPS

在MySQL 5.7之前,想要顯示此字段需使用explain extended命令;

MySQL.5.7及更高版本,explain默認(rèn)就會(huì)展示filtered

Extra

展示有關(guān)本次查詢的附加信息,取值如下:

1 Child of 'table' pushed join@1

此值只會(huì)在NDB Cluster下出現(xiàn)。

2 const row not found

例如查詢語(yǔ)句SELECT ... FROM tbl_name,而表是空的

3 Deleting all rows

對(duì)于DELETE語(yǔ)句,某些引擎(例如MyISAM)支持以一種簡(jiǎn)單而快速的方式刪除所有的數(shù)據(jù),如果使用了這種優(yōu)化,則顯示此值

4 Distinct

查找distinct值,當(dāng)找到第一個(gè)匹配的行后,將停止為當(dāng)前行組合搜索更多行

5 FirstMatch(tbl_name)

當(dāng)前使用了半連接FirstMatch策略,詳見(jiàn)https://mariadb.com/kb/en/firstmatch-strategy/[2],翻譯https://www.cnblogs.com/abclife/p/10895624.html[3]

6 Full scan on NULL key

子查詢中的一種優(yōu)化方式,在無(wú)法通過(guò)索引訪問(wèn)null值的時(shí)候使用

7 Impossible HAVING

HAVING子句始終為false,不會(huì)命中任何行

8 Impossible WHERE

WHERE子句始終為false,不會(huì)命中任何行

9 Impossible WHERE noticed after reading const tables

MySQL已經(jīng)讀取了所有const(或system)表,并發(fā)現(xiàn)WHERE子句始終為false

10 LooseScan(m..n)

當(dāng)前使用了半連接LooseScan策略,詳見(jiàn)https://mariadb.com/kb/en/loosescan-strategy/[4],翻譯http://www.javacoder.cn/?p=39[5]

11 No matching min/max row

沒(méi)有任何能滿足例如 SELECT MIN(...) FROM ... WHERE condition 中的condition的行

12 no matching row in const table

對(duì)于關(guān)聯(lián)查詢,存在一個(gè)空表,或者沒(méi)有行能夠滿足唯一索引條件

13 No matching rows after partition pruning

對(duì)于DELETE或UPDATE語(yǔ)句,優(yōu)化器在partition pruning(分區(qū)修剪)之后,找不到要delete或update的內(nèi)容

14 No tables used

當(dāng)此查詢沒(méi)有FROM子句或擁有FROM DUAL子句時(shí)出現(xiàn)。例如:explain select 1

15 Not exists

MySQL能對(duì)LEFT JOIN優(yōu)化,在找到符合LEFT JOIN的行后,不會(huì)為上一行組合中檢查此表中的更多行。例如:

SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;

假設(shè)t2.id定義成了NOT NULL,此時(shí),MySQL會(huì)掃描t1,并使用t1.id的值查找t2中的行。如果MySQL在t2中找到一個(gè)匹配的行,它會(huì)知道t2.id永遠(yuǎn)不會(huì)為NULL,并且不會(huì)掃描t2中具有相同id值的其余行。也就是說(shuō),對(duì)于t1中的每一行,MySQL只需要在t2中只執(zhí)行一次查找,而不考慮在t2中實(shí)際匹配的行數(shù)。

在MySQL 8.0.17及更高版本中,如果出現(xiàn)此提示,還可表示形如 NOT IN (subquery) 或 NOT EXISTS (subquery) 的WHERE條件已經(jīng)在內(nèi)部轉(zhuǎn)換為反連接。這將刪除子查詢并將其表放入最頂層的查詢計(jì)劃中,從而改進(jìn)查詢的開(kāi)銷。通過(guò)合并半連接和反聯(lián)接,優(yōu)化器可以更加自由地對(duì)執(zhí)行計(jì)劃中的表重新排序,在某些情況下,可讓查詢提速。你可以通過(guò)在EXPLAIN語(yǔ)句后緊跟一個(gè)SHOW WARNING語(yǔ)句,并分析結(jié)果中的Message列,從而查看何時(shí)對(duì)該查詢執(zhí)行了反聯(lián)接轉(zhuǎn)換。

Note

兩表關(guān)聯(lián)只返回主表的數(shù)據(jù),并且只返回主表與子表沒(méi)關(guān)聯(lián)上的數(shù)據(jù),這種連接就叫反連接

16 Plan isn't ready yet

使用了EXPLAIN FOR CONNECTION,當(dāng)優(yōu)化器尚未完成為在指定連接中為執(zhí)行的語(yǔ)句創(chuàng)建執(zhí)行計(jì)劃時(shí), 就會(huì)出現(xiàn)此值。

17 Range checked for each record (index map: N)

MySQL沒(méi)有找到合適的索引去使用,但是去檢查是否可以使用range或index_merge來(lái)檢索行時(shí),會(huì)出現(xiàn)此提示。index map N索引的編號(hào)從1開(kāi)始,按照與表的SHOW INDEX所示相同的順序。索引映射值N是指示哪些索引是候選的位掩碼值。例如0x19(二進(jìn)制11001)的值意味著將考慮索引1、4和5。

示例:下面例子中,name是varchar類型,但是條件給出整數(shù)型,涉及到隱式轉(zhuǎn)換。圖中t2也沒(méi)有用到索引,是因?yàn)椴樵冎拔覍2中name字段排序規(guī)則改為utf8_bin導(dǎo)致的鏈接字段排序規(guī)則不匹配。

explain select a.* from t1 a left join t2 bon t1.name = t2.namewhere t2.name = 2;

結(jié)果:

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t2 NULL ALL idx_name NULL NULL NULL 9 11.11 Using where
1 SIMPLE t1 NULL ALL idx_name NULL NULL NULL 5 11.11 Range checked for each record (index map: 0x8)

18 Recursive

出現(xiàn)了遞歸查詢。詳見(jiàn)“WITH (Common Table Expressions)”[6]

19 Rematerialize

用得很少,使用類似如下SQL時(shí),會(huì)展示Rematerialize

SELECT ...FROM t, LATERAL (derived table that refers to t) AS dt...

20 Scanned N databases

表示在處理INFORMATION_SCHEMA表的查詢時(shí),掃描了幾個(gè)目錄,N的取值可以是0,1或者all。詳見(jiàn)“Optimizing INFORMATION_SCHEMA Queries”[7]

21 Select tables optimized away

優(yōu)化器確定:①最多返回1行;②要產(chǎn)生該行的數(shù)據(jù),要讀取一組確定的行,時(shí)會(huì)出現(xiàn)此提示。一般在用某些聚合函數(shù)訪問(wèn)存在索引的某個(gè)字段時(shí),優(yōu)化器會(huì)通過(guò)索引直接一次定位到所需要的數(shù)據(jù)行完成整個(gè)查詢時(shí)展示,例如下面這條SQL。

explainselect min(id)from t1;

22 Skip_open_table, Open_frm_only, Open_full_table

這些值表示適用于INFORMATION_SCHEMA表查詢的文件打開(kāi)優(yōu)化;

23 Skip_open_table:無(wú)需打開(kāi)表文件,信息已經(jīng)通過(guò)掃描數(shù)據(jù)字典獲得

24 Open_frm_only:僅需要讀取數(shù)據(jù)字典以獲取表信息

25 Open_full_table:未優(yōu)化的信息查找。表信息必須從數(shù)據(jù)字典以及表文件中讀取

26 Start temporary, End temporary

表示臨時(shí)表使用Duplicate Weedout策略,詳見(jiàn)https://mariadb.com/kb/en/duplicateweedout-strategy/[8],翻譯https://www.cnblogs.com/abclife/p/10895531.html[9]

27 unique row not found

對(duì)于形如 SELECT ... FROM tbl_name 的查詢,但沒(méi)有行能夠滿足唯一索引或主鍵查詢的條件

28 Using filesort

當(dāng)Query 中包含 ORDER BY 操作,而且無(wú)法利用索引完成排序操作的時(shí)候,MySQL Query Optimizer 不得不選擇相應(yīng)的排序算法來(lái)實(shí)現(xiàn)。數(shù)據(jù)較少時(shí)從內(nèi)存排序,否則從磁盤(pán)排序。Explain不會(huì)顯示的告訴客戶端用哪種排序。官方解釋:“MySQL需要額外的一次傳遞,以找出如何按排序順序檢索行。通過(guò)根據(jù)聯(lián)接類型瀏覽所有行并為所有匹配WHERE子句的行保存排序關(guān)鍵字和行的指針來(lái)完成排序。然后關(guān)鍵字被排序,并按排序順序檢索行”

29 Using index

僅使用索引樹(shù)中的信息從表中檢索列信息,而不必進(jìn)行其他查找以讀取實(shí)際行。當(dāng)查詢僅使用屬于單個(gè)索引的列時(shí),可以使用此策略。例如:

explain SELECT id FROM t

30 Using index condition

表示先按條件過(guò)濾索引,過(guò)濾完索引后找到所有符合索引條件的數(shù)據(jù)行,隨后用 WHERE 子句中的其他條件去過(guò)濾這些數(shù)據(jù)行。通過(guò)這種方式,除非有必要,否則索引信息將可以延遲“下推”讀取整個(gè)行的數(shù)據(jù)。詳見(jiàn)“Index Condition Pushdown Optimization”[10]。例如:

TIPS

?

MySQL分成了Server層和引擎層,下推指的是將請(qǐng)求交給引擎層處理。

?

理解這個(gè)功能,可創(chuàng)建所以INDEX (zipcode, lastname, firstname),并分別用如下指令,

SET optimizer_switch = 'index_condition_pushdown=off'; SET optimizer_switch = 'index_condition_pushdown=on';

開(kāi)或者關(guān)閉索引條件下推,并對(duì)比:

explain SELECT * FROM people WHERE zipcode='95054' AND lastname LIKE '%etrunia%' AND address LIKE '%Main Street%';

的執(zhí)行結(jié)果。

?

index condition pushdown從MySQL 5.6開(kāi)始支持,是MySQL針對(duì)特定場(chǎng)景的優(yōu)化機(jī)制,感興趣的可以看下https://blog.51cto.com/lee90/2060449[11]

31 Using index for group-by

數(shù)據(jù)訪問(wèn)和 Using index 一樣,所需數(shù)據(jù)只須要讀取索引,當(dāng)Query 中使用GROUP BY或DISTINCT 子句時(shí),如果分組字段也在索引中,Extra中的信息就會(huì)是 Using index for group-by。詳見(jiàn)“GROUP BY Optimization”[12]

-- name字段有索引explain SELECT name FROM t1 group by name

32 Using index for skip scan

表示使用了Skip Scan。詳見(jiàn)Skip Scan Range Access Method[13]

33 Using join buffer (Block Nested Loop), Using join buffer (Batched Key Access)

使用Block Nested Loop或Batched Key Access算法提高join的性能。詳見(jiàn)https://www.cnblogs.com/chenpingzhao/p/6720531.html[14]

34 Using MRR

使用了Multi-Range Read優(yōu)化策略。詳見(jiàn)“Multi-Range Read Optimization”[15]

35 Using sort_union(...), Using union(...), Using intersect(...)

這些指示索引掃描如何合并為index_merge連接類型。詳見(jiàn)“Index Merge Optimization”[16]。

36 Using temporary

為了解決該查詢,MySQL需要?jiǎng)?chuàng)建一個(gè)臨時(shí)表來(lái)保存結(jié)果。如果查詢包含不同列的GROUP BY和 ORDER BY子句,通常會(huì)發(fā)生這種情況。

-- name無(wú)索引explain SELECT name FROM t1 group by name

37 Using where

如果我們不是讀取表的所有數(shù)據(jù),或者不是僅僅通過(guò)索引就可以獲取所有需要的數(shù)據(jù),則會(huì)出現(xiàn)using where信息

explain SELECT * FROM t1 where id > 5

38 Using where with pushed condition

僅用于NDB

39 Zero limit

該查詢有一個(gè)limit 0子句,不能選擇任何行

explain SELECT name FROM resource_template limit 0

擴(kuò)展的EXPLAIN

EXPLAIN可產(chǎn)生額外的擴(kuò)展信息,可通過(guò)在EXPLAIN語(yǔ)句后緊跟一條SHOW WARNING語(yǔ)句查看擴(kuò)展信息。

TIPS

?在MySQL 8.0.12及更高版本,擴(kuò)展信息可用于SELECT、DELETE、INSERT、REPLACE、UPDATE語(yǔ)句;在MySQL 8.0.12之前,擴(kuò)展信息僅適用于SELECT語(yǔ)句;?在MySQL 5.6及更低版本,需使用EXPLAIN EXTENDED xxx語(yǔ)句;而從MySQL 5.7開(kāi)始,無(wú)需添加EXTENDED關(guān)鍵詞。

使用示例:

mysql> EXPLAIN SELECT t1.a, t1.a IN (SELECT t2.a FROM t2) FROM t1G*************************** 1. row *************************** id: 1 select_type: PRIMARY table: t1 type: indexpossible_keys: NULL key: PRIMARY key_len: 4 ref: NULL rows: 4 filtered: 100.00 Extra: Using index*************************** 2. row *************************** id: 2 select_type: SUBQUERY table: t2 type: indexpossible_keys: a key: a key_len: 5 ref: NULL rows: 3 filtered: 100.00 Extra: Using index2 rows in set, 1 warning (0.00 sec) mysql> SHOW WARNINGSG*************************** 1. row *************************** Level: Note Code: 1003Message: /* select#1 */ select `test`.`t1`.`a` AS `a`, (`test`.`t1`.`a`,`test`.`t1`.`a` in ( (/* select#2 */ select `test`.`t2`.`a` from `test`.`t2` where 1 having 1 ), (`test`.`t1`.`a` in on where ((`test`.`t1`.`a` = `materialized-subquery`.`a`))))) AS `t1.a IN (SELECT t2.a FROM t2)` from `test`.`t1`1 row in set (0.00 sec)

由于SHOW WARNING的結(jié)果并不一定是一個(gè)有效SQL,也不一定能夠執(zhí)行(因?yàn)槔锩姘撕芏嗵厥鈽?biāo)記)。特殊標(biāo)記取值如下:

1

自動(dòng)生成的臨時(shí)表key

2(expr)

表達(dá)式(例如標(biāo)量子查詢)執(zhí)行了一次,并且將值保存在了內(nèi)存中以備以后使用。對(duì)于包括多個(gè)值的結(jié)果,可能會(huì)創(chuàng)建臨時(shí)表,你將會(huì)看到的字樣

3(query fragment)

子查詢被轉(zhuǎn)換為EXISTS

4(query fragment)

這是一個(gè)內(nèi)部?jī)?yōu)化器對(duì)象,對(duì)用戶沒(méi)有任何意義

5(query fragment)

使用索引查找來(lái)處理查詢片段,從而找到合格的行

6(condition, expr1, expr2)

如果條件是true,則取expr1,否則取expr2

7(expr)

驗(yàn)證表達(dá)式不為NULL的測(cè)試

8(query fragment)

使用子查詢實(shí)現(xiàn)

9materialized-subquery.col_name

在內(nèi)部物化臨時(shí)表中對(duì)col_name的引用,以保存子查詢的結(jié)果

10(query fragment)

使用主鍵來(lái)處理查詢片段,從而找到合格的行

11(expr)

這是一個(gè)內(nèi)部?jī)?yōu)化器對(duì)象,對(duì)用戶沒(méi)有任何意義

12/* select#N */ select_stmt

SELECT與非擴(kuò)展的EXPLAIN輸出中id=N的那行關(guān)聯(lián)

13outer_tables semi join (inner_tables)

半連接操作。inner_tables展示未拉出的表。詳見(jiàn)“Optimizing Subqueries, Derived Tables, and View References with Semijoin Transformations”[17]

14

表示創(chuàng)建了內(nèi)部臨時(shí)表而緩存中間結(jié)果

當(dāng)某些表是const或system類型時(shí),這些表中的列所涉及的表達(dá)式將由優(yōu)化器盡早評(píng)估,并且不屬于所顯示語(yǔ)句的一部分。但是,當(dāng)使用FORMAT=JSON時(shí),某些const表的訪問(wèn)將顯示為ref。

估計(jì)查詢性能

多數(shù)情況下,你可以通過(guò)計(jì)算磁盤(pán)的搜索次數(shù)來(lái)估算查詢性能。對(duì)于比較小的表,通??梢栽谝淮未疟P(pán)搜索中找到行(因?yàn)樗饕赡芤呀?jīng)被緩存了),而對(duì)于更大的表,你可以使用B-tree索引進(jìn)行估算:你需要進(jìn)行多少次查找才能找到行:log(row_count) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1

在MySQL中,index_block_length通常是1024字節(jié),數(shù)據(jù)指針一般是4字節(jié)。比方說(shuō),有一個(gè)500,000的表,key是3字節(jié),那么根據(jù)計(jì)算公式log(500,000)/log(1024/3*2/(3+4)) + 1 = 4次搜索。

該索引將需要500,000 * 7 * 3/2 = 5.2MB的存儲(chǔ)空間(假設(shè)典型的索引緩存的填充率是2/3),因此你可以在內(nèi)存中存放更多索引,可能只要一到兩個(gè)調(diào)用就可以找到想要的行了。

但是,對(duì)于寫(xiě)操作,你需要四個(gè)搜索請(qǐng)求來(lái)查找在何處放置新的索引值,然后通常需要2次搜索來(lái)更新索引并寫(xiě)入行。

前面的討論并不意味著你的應(yīng)用性能會(huì)因?yàn)閘og N而緩慢下降。只要內(nèi)容被OS或MySQL服務(wù)器緩存,隨著表的變大,只會(huì)稍微變慢。在數(shù)據(jù)量變得太大而無(wú)法緩存后,將會(huì)變慢很多,直到你的應(yīng)用程序受到磁盤(pán)搜索約束(按照l(shuí)og N增長(zhǎng))。為了避免這種情況,可以根據(jù)數(shù)據(jù)的增長(zhǎng)而增加key的。對(duì)于MyISAM表,key的緩存大小由名為key_buffer_size的系統(tǒng)變量控制,詳見(jiàn)Section 5.1.1, “Configuring the Server”[18]

參考文檔

?EXPLAIN Output Format[19]?EXPLAIN Statement[20]?Extended EXPLAIN Output Format[21]?Estimating Query Performance[22]?MySQL中explain執(zhí)行計(jì)劃中額外信息字段(Extra)詳解[23]?explain參數(shù)詳解[24]?What does eq_ref and ref types mean in MySQL explain[25]?面試官:不會(huì)看 Explain執(zhí)行計(jì)劃,簡(jiǎn)歷敢寫(xiě) SQL 優(yōu)化?

責(zé)任編輯:xj

原文標(biāo)題:全網(wǎng)最全 | MySQL EXPLAIN 完全解讀

文章出處:【微信公眾號(hào):數(shù)據(jù)分析與開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7292

    瀏覽量

    93365
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    890

    瀏覽量

    28865

原文標(biāo)題:全網(wǎng)最全 | MySQL EXPLAIN 完全解讀

文章出處:【微信號(hào):DBDevs,微信公眾號(hào):數(shù)據(jù)分析與開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    全網(wǎng)最全CSA3412,BCT4340,VL162,MCU/ USB3.1 正反插10G bps四種解決方案

    CSA3412,BCT4340,VL162,MCU/ USB3.1 全網(wǎng)最全正反插10G bps四種解決方案
    的頭像 發(fā)表于 09-25 03:06 ?193次閱讀
    <b class='flag-5'>全網(wǎng)</b><b class='flag-5'>最全</b>CSA3412,BCT4340,VL162,MCU/ USB3.1 正反插10G bps四種解決方案

    2025年AI 智能終端和SoC芯片解讀

    電子發(fā)燒友網(wǎng)站提供《2025年AI 智能終端和SoC芯片解讀.pptx》資料免費(fèi)下載
    發(fā)表于 09-15 16:38 ?170次下載

    HarmonyOSAI編程智能代碼解讀

    CodeGenie > Explain Code,開(kāi)始解讀當(dāng)前代碼內(nèi)容。 說(shuō)明 最多支持解讀20000字符以內(nèi)的代碼片段。 使用該功能需先完成CodeGenie登錄授權(quán)。 本文主要從參考引用自HarmonyOS官方文檔
    發(fā)表于 09-02 16:29

    HarmonyOS AI輔助編程工具(CodeGenie)代碼智能解讀

    。 選中.ets文件或者.cpp文件中需要被解釋的代碼行或代碼片段,右鍵選擇CodeGenie > Explain Code,開(kāi)始解讀當(dāng)前代碼內(nèi)容。 說(shuō)明 ?最多支持解讀20000字符以內(nèi)
    發(fā)表于 07-17 17:02

    SPI協(xié)議,寄存器解讀

    最近在學(xué)習(xí)SPI協(xié)議,對(duì)寄存器操作不是特別熟練。發(fā)帖希望有大佬能從寄存器角度提供幫助,幫忙指導(dǎo)根據(jù)手冊(cè)去解讀協(xié)議。有償。
    發(fā)表于 05-22 20:08

    車載智能終端4G全網(wǎng)通硬件TBOX設(shè)計(jì)與用途

    車載智能終端4G全網(wǎng)通硬件TBOX
    的頭像 發(fā)表于 04-10 12:05 ?3230次閱讀
    車載智能終端4G<b class='flag-5'>全網(wǎng)</b>通硬件TBOX設(shè)計(jì)與用途

    最全面的EMC設(shè)計(jì)經(jīng)驗(yàn),強(qiáng)烈推薦大家看看.

    文件過(guò)大,需要完整版資料可下載附件查看哦!
    發(fā)表于 03-22 15:01

    華為MetaAAU在阿根廷完成全網(wǎng)部署

    華為MetaAAU在阿根廷完成全網(wǎng)部署,助力運(yùn)營(yíng)商打造拉美最大規(guī)模的MetaAAU網(wǎng)絡(luò)。依托這一先進(jìn)網(wǎng)絡(luò)基礎(chǔ),運(yùn)營(yíng)商在互聯(lián)網(wǎng)測(cè)試和分析領(lǐng)域的全球領(lǐng)導(dǎo)者 ——Ookla 的評(píng)分中脫穎而出,僅僅8個(gè)月的時(shí)間,一舉榮獲拉美地區(qū) No.1 的領(lǐng)先地位。
    的頭像 發(fā)表于 03-04 10:20 ?761次閱讀

    SMA插頭型號(hào)詳解:全面解讀與應(yīng)用指南

    ,以其操作便捷、性能卓越,成為SMA插頭領(lǐng)域的佼佼者。本文將對(duì)SMA插頭的型號(hào)進(jìn)行詳細(xì)解讀,并探討其在不同應(yīng)用中的適用性。
    的頭像 發(fā)表于 02-21 09:24 ?3274次閱讀
    SMA插頭型號(hào)詳解:<b class='flag-5'>全面</b><b class='flag-5'>解讀</b>與應(yīng)用指南

    MOSFET參數(shù)解讀

    SGT-MOSFET各項(xiàng)參數(shù)解讀
    發(fā)表于 12-30 14:15 ?1次下載

    三、麥克風(fēng)陣列類型及分類之細(xì)致梳理

    麥克風(fēng)陣列,作為聲學(xué)領(lǐng)域的關(guān)鍵技術(shù),擁有多種類型,每種類型都以獨(dú)特的排列方式和卓越的性能,在不同的應(yīng)用場(chǎng)景中發(fā)揮著重要作用,下面將為您細(xì)致梳理其類型與分類,展現(xiàn)麥克風(fēng)陣列的奇妙世界。
    的頭像 發(fā)表于 12-29 00:00 ?1330次閱讀
    三、麥克風(fēng)陣列類型及分類之<b class='flag-5'>細(xì)致</b>梳理

    PCM1680 does not support a board-to-board interface不支持板對(duì)板的是怎么解讀?

    The PCM1680 does not support a board-to-board interface不支持板對(duì)板的是怎么解讀
    發(fā)表于 12-11 07:31

    全網(wǎng)精選 中服云全網(wǎng)精選工業(yè)網(wǎng)關(guān)廠商名錄

    精準(zhǔn)選型,加速數(shù)字化轉(zhuǎn)型進(jìn)程,中服云經(jīng)過(guò)一個(gè)多月全面細(xì)致的收集與分析,精心整理了一份全網(wǎng)優(yōu)質(zhì)工業(yè)網(wǎng)關(guān)廠商名錄,旨在為企業(yè)打造一條通往智能制造的“高速通道”。 在這個(gè)名錄中,我們匯聚了來(lái)自國(guó)內(nèi)優(yōu)質(zhì)的工業(yè)網(wǎng)關(guān)制
    的頭像 發(fā)表于 11-11 10:48 ?658次閱讀
    <b class='flag-5'>全網(wǎng)</b>精選  中服云<b class='flag-5'>全網(wǎng)</b>精選工業(yè)網(wǎng)關(guān)廠商名錄

    京準(zhǔn)電鐘解讀:PTP時(shí)鐘同步系統(tǒng)及應(yīng)用是什么?

    京準(zhǔn)電鐘解讀:PTP時(shí)鐘同步系統(tǒng)及應(yīng)用是什么?
    的頭像 發(fā)表于 10-31 09:35 ?1098次閱讀
    京準(zhǔn)電鐘<b class='flag-5'>解讀</b>:PTP時(shí)鐘同步系統(tǒng)及應(yīng)用是什么?

    北京安防博覽會(huì)圓滿閉幕!華電子智慧路燈全網(wǎng)運(yùn)維管理驚艷全場(chǎng)!

    北京安防博覽會(huì)圓滿閉幕!華電子智慧路燈全網(wǎng)運(yùn)維管理驚艷全場(chǎng)!
    的頭像 發(fā)表于 10-28 10:32 ?631次閱讀
    北京安防博覽會(huì)圓滿閉幕!華電子智慧路燈<b class='flag-5'>全網(wǎng)</b>運(yùn)維管理驚艷全場(chǎng)!