溫馨提示×

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

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

mysql執(zhí)行計(jì)劃指的是什么

發(fā)布時(shí)間:2022-11-14 09:12:41 來(lái)源:億速云 閱讀:132 作者:iii 欄目:MySQL數(shù)據(jù)庫(kù)

這篇文章主要講解了“mysql執(zhí)行計(jì)劃指的是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“mysql執(zhí)行計(jì)劃指的是什么”吧!

在mysql中,執(zhí)行計(jì)劃是數(shù)據(jù)庫(kù)提供給用戶(hù)的一套對(duì)sql語(yǔ)句進(jìn)行解析、分析、優(yōu)化功能的工具。執(zhí)行計(jì)劃的作用有:1、展示表的讀取順序;2、數(shù)據(jù)讀取操作的類(lèi)型;3、展示哪些索引是可以使用的;4、展示哪些索引是實(shí)際上使用的;5、展示表之間的引用關(guān)系;6、展示每張表被查詢(xún)的行數(shù)。

在數(shù)據(jù)庫(kù)查詢(xún)的時(shí)候,我們通常會(huì)使用sql語(yǔ)句去查詢(xún)自己所需要的數(shù)據(jù)。但是,關(guān)于sql在數(shù)據(jù)庫(kù)中是如何執(zhí)行的,它有沒(méi)有使用索引,具體使用了哪些索引,查找了哪些字段和表,他們的順序是怎樣的,分別用時(shí)多少等等信息我們不得而知,那么有沒(méi)有什么方法可以看到這些信息,mysql給我們提供了一套工具——執(zhí)行計(jì)劃。

一、什么是執(zhí)行計(jì)劃

執(zhí)行計(jì)劃是數(shù)據(jù)庫(kù)提供給我們的一套對(duì)sql語(yǔ)句進(jìn)行解析、分析、優(yōu)化功能的工具,他具有以下的作用:

  • 展示表的讀取順序;

  • 數(shù)據(jù)讀取操作的類(lèi)型;

  • 哪些索引是可以使用的;

  • 哪些索引是實(shí)際上使用的;

  • 表之間的引用關(guān)系;

  • 每張表被查詢(xún)的行數(shù)。

注意:執(zhí)行計(jì)劃只是數(shù)據(jù)庫(kù)針對(duì)sql給出最佳的優(yōu)化參考方案,并不一定是最優(yōu)解,即不要過(guò)度相信執(zhí)行計(jì)劃

二、如何使用執(zhí)行計(jì)劃

使用執(zhí)行計(jì)劃很簡(jiǎn)單,在要執(zhí)行的sql前面加上關(guān)鍵詞explain即可。

三、執(zhí)行計(jì)劃信息

mysql執(zhí)行計(jì)劃指的是什么

從圖中可以看出,sql執(zhí)行計(jì)劃主要包含以下信息:id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、Extra。

3.1、id

select查詢(xún)序列號(hào),id相同,執(zhí)行順序由上至下;id不同,id值越大優(yōu)先級(jí)越高,越先被執(zhí)行;

3.2、select_type

select_type:表示select語(yǔ)句的類(lèi)型,可以有以下取值;

  • SIMPLE:表示簡(jiǎn)單查詢(xún),其中不包含連接查詢(xún)和?查詢(xún);

  • PRIMARY: 表示主查詢(xún),或者是最外?的查詢(xún)語(yǔ)句;

  • UNION:表示連接查詢(xún)的第2個(gè)或后?的查詢(xún)語(yǔ)句;

  • DEPENDENT UNION:UNION中的第?個(gè)或后?的SELECT語(yǔ)句,取決于外?的查詢(xún);

  • UNION RESULT: 連接查詢(xún)的結(jié)果;

  • SUBQUERY:?查詢(xún)中的第1個(gè)SELECT語(yǔ)句;

  • DEPENDENT SUBQUERY:?查詢(xún)中的第1個(gè)SELECT語(yǔ)句,取決于外?的查詢(xún);

  • DERIVED:SELECT(FROM ?句的?查詢(xún))。

3.3、table

table:表示查詢(xún)的表名,可以有以下幾種情況:

  • 顯示表名,如果起了別名,則顯示別名;

  • <derivenN>:表示查詢(xún)的條件是一個(gè)子查詢(xún);

  • <union1,2>:表示表1和表2使用union。

3.4、partitions

partitions:匹配的分區(qū)。

3.5、type

type:這?列表示表關(guān)聯(lián)類(lèi)型或訪問(wèn)類(lèi)型,即數(shù)據(jù)庫(kù)決定如何查找表中的?,查找數(shù)據(jù)?記錄的?概范圍。依次從最優(yōu)到最差分別為:system > const > eq_ref > ref > range > index > all

  • system:表中只有一行記錄,相當(dāng)于系統(tǒng)表,這是const類(lèi)型的特列,平時(shí)不會(huì)出現(xiàn),可以忽略不計(jì);

  • const:通過(guò)索引一次命中,匹配一行數(shù)據(jù),所以很快,常?于PRIMARY KEY或者UNIQUE索引的查詢(xún),可理解為const是最優(yōu)化的;

  • eq_ref:唯一性索引掃描,對(duì)于每個(gè)索引鍵,表中只有一條記錄與之匹配,常用語(yǔ)主鍵或唯一索引掃描,這可能是在 const 之外最好的聯(lián)接類(lèi)型了;

  • ref:非唯一性索引掃描,返回匹配某個(gè)單獨(dú)值的所有行,用于=、<或>操作符帶索引的列;

  • range:只檢索給定范圍的行,使用一個(gè)索引來(lái)選擇行,一般用于between、<、>、in等查詢(xún),這種范圍查詢(xún)要比index要好,因?yàn)樗恍枰獟呙杷饕囊粋€(gè)點(diǎn),結(jié)束于另外一個(gè)點(diǎn);

  • index:需要遍歷索引樹(shù);

  • all:即全表掃描,意味著數(shù)據(jù)庫(kù)需要從頭到尾去查找所需要的?。通常情況下這需要增加索引來(lái)進(jìn)?優(yōu)化了。

注意:在進(jìn)行sql優(yōu)化的時(shí)候至少要優(yōu)化到range,推薦優(yōu)化到ref,最好是const。

3.6、possible_keys

possible_keys:這?列顯示查詢(xún)可能使?哪些索引來(lái)查找。explain 時(shí)可能出現(xiàn) possible_keys 有列,? key 顯示 NULL 的情況,這種情況是因?yàn)楸碇袛?shù)據(jù)不多,數(shù)據(jù)庫(kù)認(rèn)為索引對(duì)此查詢(xún)幫助不?,選擇了全表查詢(xún)。
如果該列是NULL,則沒(méi)有相關(guān)的索引。在這種情況下,可以通過(guò)檢查 where ?句看是否可以創(chuàng)造?個(gè)適當(dāng)?shù)乃饕齺?lái)提?查詢(xún)性能,然后? explain 查看效果。

3.7、key

key:顯示數(shù)據(jù)庫(kù)實(shí)際決定使?的鍵(索引)。如果沒(méi)有選擇索引,key的值是NULL??梢詮?qiáng)制使?索引或者忽略索引。

3.8、key_len

key_len:這?列顯示了數(shù)據(jù)庫(kù)在索引?使?的字節(jié)數(shù),通過(guò)這個(gè)值可以算出具體使?了索引中的哪些列,數(shù)值計(jì)算如下:

字符串類(lèi)型
char(n):n字節(jié)長(zhǎng)度
varchar(n):2字節(jié)存儲(chǔ)字符串長(zhǎng)度,如果是utf-8,則長(zhǎng)度 3n + 2

數(shù)值類(lèi)型
tinyint:1字節(jié)
smallint:2字節(jié)
int:4字節(jié)
bigint:8字節(jié)  

時(shí)間類(lèi)型 
date:3字節(jié)
timestamp:4字節(jié)
datetime:8字節(jié)

如果字段允許為 NULL,需要1字節(jié)記錄是否為 NULL

注意:索引最??度是768字節(jié),當(dāng)字符串過(guò)?時(shí),數(shù)據(jù)庫(kù)會(huì)做?個(gè)類(lèi)似左前綴索引的處理,將前半部分的字符提取出來(lái)做索引。

3.9、ref

ref:這?列顯示了在key列記錄的索引中表查找值所?到的列或常量,常見(jiàn)的有:const(常量),func,null,字段名(例:film.id)

3.10、rows

rows:這?列是數(shù)據(jù)庫(kù)估計(jì)要讀取并掃描的?數(shù),注意這個(gè)不是結(jié)果集?的?數(shù),因此這個(gè)值越小越好。

3.11、filtered

filtered:返回結(jié)果的行數(shù)占讀取行數(shù)的百分比,值越大越好。

3.12、Extra

extra:這一列顯示的是額外的信息,即不包含在其他列的信息,具體值如下:

  • distinct:數(shù)據(jù)庫(kù)發(fā)現(xiàn)第1個(gè)匹配?后,停?為當(dāng)前的?組合搜索更多的?;

  • not exists:數(shù)據(jù)庫(kù)能夠?qū)Σ樵?xún)進(jìn)?LEFT JOIN優(yōu)化,發(fā)現(xiàn)1個(gè)匹配LEFT JOIN標(biāo)準(zhǔn)的?后,不再為前?的的?組合在該表內(nèi)檢查更多的?;

  • range checked for each record (index map: #):數(shù)據(jù)庫(kù)沒(méi)有發(fā)現(xiàn)好的可以使?的索引,但發(fā)現(xiàn)如果來(lái)?前?的表的列值已知,可能部分索引可以使?;

  • using filesort(重點(diǎn)):數(shù)據(jù)庫(kù)會(huì)對(duì)結(jié)果使??個(gè)外部索引排序,?不是按索引次序從表?讀取?。此時(shí)mysql會(huì)根據(jù)聯(lián)接類(lèi)型瀏覽所有符合條件的記錄,并保存排序關(guān)鍵字和?指針,然后排序關(guān)鍵字并按順序檢索?信息。這種情況下?般也是要考慮使?索引來(lái)優(yōu)化的;

  • using index(重點(diǎn)):從只使?索引樹(shù)中的信息?不需要進(jìn)?步搜索讀取實(shí)際的?來(lái)檢索表中的列信息,即表示select使用了覆蓋索引而不必去回表查詢(xún);

  • using temporary(重點(diǎn)):數(shù)據(jù)庫(kù)需要創(chuàng)建?張臨時(shí)表來(lái)處理查詢(xún),這種情況常見(jiàn)于order by和group by。出現(xiàn)這種情況?般是要進(jìn)?優(yōu)化的,?先是想到?索引來(lái)優(yōu)化;

  • using where:數(shù)據(jù)庫(kù)將在存儲(chǔ)引擎檢索?后再進(jìn)?過(guò)濾。就是先讀取整?數(shù)據(jù),再按where 條件進(jìn)?檢查,符合就留下,不符合就丟棄;

  • using index condition:與Using where類(lèi)似,查詢(xún)的列不完全被索引覆蓋,where條件中是?個(gè)前導(dǎo)列的范圍;

  • using sort_union(...), Using union(...), Using intersect(...):這些函數(shù)說(shuō)明如何為index_merge聯(lián)接類(lèi)型合并索引掃描;

  • using index for group-by:類(lèi)似于訪問(wèn)表的Using index?式,Using index for group-by表示數(shù)據(jù)庫(kù)發(fā)現(xiàn)了?個(gè)索引,可以?來(lái)查 詢(xún)group by或distinct查詢(xún)的所有列,?不要額外搜索硬盤(pán)訪問(wèn)實(shí)際的表;

  • null:查詢(xún)的列未被索引覆蓋,并且where篩選條件是索引的前導(dǎo)列,意味著?到了索引,但是部分字段未被索引覆蓋,必須通過(guò)“回表”來(lái)實(shí)現(xiàn),不是純粹地?到了索引,也不是完全沒(méi)?到索引,即使用了索引但需要回表操作,應(yīng)該避免回表操作。

感謝各位的閱讀,以上就是“mysql執(zhí)行計(jì)劃指的是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)mysql執(zhí)行計(jì)劃指的是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

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

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

AI