Mysql explain 执行计划 解释
一:Mysql explain 執(zhí)行計(jì)劃
前言:
使用 explain 執(zhí)行sql計(jì)劃,以便分析Sql執(zhí)行過(guò)程 涉及多少行、使用哪些索引、運(yùn)行時(shí)間等 以便進(jìn)行優(yōu)化。
如:
explain 名詞解釋:
| id | SQL執(zhí)行的順序的標(biāo)識(shí),SQL從大到小的執(zhí)行 |
說(shuō)明: id 不同連接類型的解釋
id相同時(shí),執(zhí)行順序由上至下
如果是子查詢,id的序號(hào)會(huì)遞增,id值越大優(yōu)先級(jí)越高,越先被執(zhí)行
id如果相同,可以認(rèn)為是一組,從上往下順序執(zhí)行;在所有組中,id值越大,優(yōu)先級(jí)越高,越先執(zhí)行
| table | 顯示這一行的數(shù)據(jù)是關(guān)于哪張表的 |
| select_type | 查詢中每個(gè)select子句的類型 |
說(shuō)明: select_type 不同連接類型的解釋
| type | 這是重要的列,顯示連接使用了何種類型。從最好到最差的連接類型為const、eq_reg、ref、range、indexhe和ALL |
說(shuō)明: type 不同連接類型的解釋(按照效率高低的順序排序)
| possible_keys | 顯示可能應(yīng)用在這張表中的索引。如果為空,沒(méi)有可能的索引。可以為相關(guān)的域從WHERE語(yǔ)句中選擇一個(gè)合適的語(yǔ)句 |
| key | 實(shí)際使用的索引。如果為NULL,則沒(méi)有使用索引。很少的情況下,MYSQL會(huì)選擇優(yōu)化不足的索引。這種情況下,可以在SELECT語(yǔ)句中使用USE INDEX(indexname)來(lái)強(qiáng)制使用一個(gè)索引或者用IGNORE INDEX(indexname)來(lái)強(qiáng)制MYSQL忽略索引 |
| key_len | 使用的索引的長(zhǎng)度。在不損失精確性的情況下,長(zhǎng)度越短越好 |
| ref | 顯示索引的哪一列被使用了,如果可能的話,是一個(gè)常數(shù) |
| rows | MYSQL認(rèn)為必須檢查的用來(lái)返回請(qǐng)求數(shù)據(jù)的行數(shù) |
| Extra | 關(guān)于MYSQL如何解析查詢的額外信息。將在表4.3中討論,但這里可以看到的壞的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,結(jié)果是檢索會(huì)很慢 |
說(shuō)明:extra列返回的描述的意義
Distinct :一旦mysql找到了與行相聯(lián)合匹配的行,就不再搜索了。
Not exists :mysql優(yōu)化了LEFT JOIN,一旦它找到了匹配LEFT JOIN標(biāo)準(zhǔn)的行,就不再搜索了。
Range checked for each Record(index map:#) :沒(méi)有找到理想的索引,因此對(duì)從前面表中來(lái)的每一個(gè)行組合,mysql檢查使用哪個(gè)索引,并用它來(lái)從表中返回行。這是使用索引的最慢的連接之一。
Using filesort :看到這個(gè)的時(shí)候,查詢就需要優(yōu)化了。mysql需要進(jìn)行額外的步驟來(lái)發(fā)現(xiàn)如何對(duì)返回的行排序。它根據(jù)連接類型以及存儲(chǔ)排序鍵值和匹配條件的全部行的行指針來(lái)排序全部行。
Using index :列數(shù)據(jù)是從僅僅使用了索引中的信息而沒(méi)有讀取實(shí)際的行動(dòng)的表返回的,這發(fā)生在對(duì)表的全部的請(qǐng)求列都是同一個(gè)索引的部分的時(shí)候。
Using where:表示優(yōu)化器需要通過(guò)索引回表查詢數(shù)據(jù);
Using where && Using index:自己認(rèn)為:Using index 不讀數(shù)據(jù)文件,只從索引文件中獲取數(shù)據(jù)。Using where 只是過(guò)濾元組
Using temporary :看到這個(gè)的時(shí)候,查詢需要優(yōu)化了。這里,mysql需要?jiǎng)?chuàng)建一個(gè)臨時(shí)表來(lái)存儲(chǔ)結(jié)果,這通常發(fā)生在對(duì)不同的列集進(jìn)行ORDER BY上,而不是GROUP BY上。 當(dāng)使用 DISTINCT 關(guān)鍵字 也會(huì)出現(xiàn)該狀態(tài)
Where used :使用了WHERE從句來(lái)限制哪些行將與下一張表匹配或者是返回給用戶。如果不想返回表中的全部行,并且連接類型ALL或index,這就會(huì)發(fā)生,或者是查詢有問(wèn)題。
什么是:索引回表?
如果索引的列在select子句中則不需要回表。
如果 select 子句中有大量的非索引列,就要讀取索引存放對(duì)應(yīng)的rowid,然后按照 rowid 去表中找到對(duì)應(yīng)行的非索引列,這就叫回表
總結(jié)
以上是生活随笔為你收集整理的Mysql explain 执行计划 解释的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 学妹跑过来问我为啥Xshell 打不开了
- 下一篇: mysql基于amoeba读写分离