首頁  >  文章  >  資料庫  >  mysql中執行計畫是什麼

mysql中執行計畫是什麼

青灯夜游
青灯夜游原創
2022-11-11 18:17:035506瀏覽

在mysql中,執行計劃是資料庫提供給使用者的一套對sql語句進行解析、分析、最佳化功能的工具。執行計劃的功能有:1、展示表的讀取順序;2、資料讀取操作的類型;3、展示哪些索引是可以使用的;4、展示哪些索引是實際使用的;5、展示表之間的引用關係;6、展示每張表被查詢的行數。

mysql中執行計畫是什麼

本教學操作環境:windows7系統、mysql8版本、Dell G3電腦。

在資料庫查詢的時候,我們通常會使用sql語句去查詢自己所需要的資料。但是,關於sql在資料庫中是如何執行的,它有沒有使用索引,具體使用了哪些索引,查找了哪些字段和表,他們的順序是怎樣的,分別用時多少等等信息我們不得而知,那麼有沒有什麼方法可以看到這些訊息,mysql給我們提供了一套工具——執行計畫。

一、什麼是執行計劃

執行計劃是資料庫提供給我們的一套對sql語句進行解析、分析、優化功能的工具,他有以下的作用:

  • 展示表的讀取順序;

  • #資料讀取操作的型別;

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

  • 哪些索引是實際使用的;

  • 表之間的引用關係;

  • 每張表被查詢的行數。

注意:執行計劃只是資料庫針對sql給出最佳的最佳化參考方案,不一定是最優解,即不要過度相信執行計劃

二、如何使用執行計劃

使用執行計劃很簡單,在要執行的sql前面加上關鍵字explain即可。

三、執行計畫資訊

mysql中執行計畫是什麼

# 從圖中可以看出,sql執行計畫主要包含以下資訊:id、select_type 、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、Extra。

3.1、id

select查詢序號,id相同,執行順序從上到下;id不同,id值越大優先級越高,越先被執行;

3.2、select_type

#select_type:表示select語句的類型,可以有以下取值;

  • SIMPLE:表示簡單查詢,其中不包含連接查詢和⼦查詢;

  • PRIMARY: 表示主查詢,或最外⾯的查詢語句;

  • UNION:表示連接查詢的第2個或後⾯的查詢語句;

  • DEPENDENT UNION:UNION中的⼆個或後⾯的SELECT語句,取決於外⾯的查詢;

  • #UNION RESULT: 連接查詢的結果;

  • #SUBQUERY :⼦查詢中的第1個SELECT語句;

  • DEPENDENT SUBQUERY:⼦查詢中的第1個SELECT語句,取決於外⾯的查詢;

  • #DERIVED:SELECT(FROM ⼦句的⼦查詢)。

3.3、table

table:表示查詢的表名,可以有下列幾種情況:

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

  • #:表示查詢的條件是子查詢;

  • :表示表1和表2使用union。

3.4、partitions

#partitions:符合的分割區。

3.5、type

type:這⼀列表示表格關聯類型或存取類型,也就是資料庫決定如何尋找表中的⾏,找出資料⾏記錄的⼤概範圍。依序從最優到最差分別為:system > const > eq_ref > ref > range > index > all

  • system:表中只有一行記錄,相當於系統表,這是const類型的特列,平時不會出現,可以忽略不計;

  • #const:透過索引一次命中,匹配一行數據,所以很快,常⽤於PRIMARY KEY或UNIQUE索引的查詢,可理解為const是最優化的;

  • #eq_ref:唯一性索引掃描,對於每個索引鍵,表中只有一筆記錄與之匹配,常用語主鍵或唯一索引掃描,這可能是在const 之外最好的聯接類型了;

  • ref:非唯一性索引掃描,返回匹配某個單獨值的所有行,用於=、運算子帶索引的列;

  • range:只擷取給定範圍的行,使用一個索引來選擇行,一般用於between、、in等查詢,這種範圍查詢要比index好,因為他只需要掃描索引的一個點,結束於另外一個點;

  • index:需要遍歷索引樹;

  • all:即全表掃描,意味著資料庫需要從頭到尾去找所需要的⾏。通常情況下這需要增加索引來進⾏優化了。

注意:在進行sql優化的時候至少要優化到range,推薦優化到ref,最好是const。

3.6、possible_keys

possible_keys:這⼀列顯示查詢可能會使⽤哪些索引來尋找。 explain 時可能出現 possible_keys 有列,⽽ key 顯示 NULL 的情況,這種情況是因為表中資料不多,資料庫認為索引對此查詢幫助不⼤,選擇了全表查詢。
如果該欄位是NULL,則沒有相關的索引。在這種情況下,可以透過檢查 where ⼦句看是否可以創造⼀個適當的索引來提⾼查詢效能,然後⽤ explain 查看效果。

3.7、key

key:顯示資料庫實際決定使⽤的鍵(索引)。如果沒有選擇索引,key的值是NULL。可以強制使⽤索引或忽略索引。

3.8、key_len

key_len:這⼀列顯示了資料庫在索引⾥使⽤的位元組數,透過這個值可以算出具體使⽤了索引中的哪些列,數值計算如下:

字串類型
char(n):n位元組長度
varchar(n):2位元組儲存字串長度,如果是utf-8 ,則長度3n 2

數值類型
tinyint:1位元組
smallint:2位元組
int:4位元組
bigint:8位元組

時間類型
date:3位元組
timestamp:4位元組
datetime:8位元組

如果欄位允許為NULL,則需要1位元組記錄是否為NULL

注意:索引最⼤⻓度是768字節,當字串過⻓時,資料庫會做⼀個類似左前綴索引的處理,將前半部的字元提取出來做索引。

3.9、ref

ref:這⼀列顯示了在key列記錄的索引中表查找值所⽤到的欄位或常數,常見的有:const(常數),func,null,欄位名稱(例:film.id)

3.10、rows

rows:這⼀列是資料庫估計要讀取並掃描的⾏數,注意這個不是結果集⾥的⾏數,因此這個值越小越好。

3.11、filtered

#filtered:傳回結果的行數佔讀取行數的百分比,值越大越好。

3.12、Extra

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

  • distinct:資料庫發現第1個匹配⾏後,停⽌為當前的⾏組合搜尋更多的⾏;

  • #not exists:資料庫能夠對查詢進⾏LEFT JOIN優化,發現1個符合LEFT JOIN標準的⾏後,不再為前⾯的的⾏組合在該表內檢查更多的⾏;

  • range checked for each record (index map: #):資料庫沒有發現好的可以使⽤的索引,但發現如果來⾃前⾯的表的列值已知,可能部分索引可以使⽤;

  • using filesort(重點):資料庫會對結果使⽤⼀個外部索引排序,⽽不是依索引次序從表⾥讀取⾏。此時mysql會根據聯結類型瀏覽所有符合條件的記錄,並儲存排序關鍵字和⾏指針,然後排序關鍵字並依序擷取⾏資訊。這種情況下⼀般也是要考慮使⽤索引來優化的;

  • #using index(重點):從只使⽤索引樹中的信息⽽不需要進⼀步搜尋讀取實際的⾏來檢索表中的列信息,即表示select使用了覆蓋索引而不必去回表查詢;

  • using temporary(重點):資料庫需要建立⼀張臨時表來處理查詢,這種情況常見於order by和group by。出現這種情況⼀般是要進⾏優化的,⾸先是想到⽤索引來優化;

  • using where:資料庫將在儲存引擎檢索⾏後再進⾏過濾。就是先讀取整⾏數據,再按where 條件進⾏檢查,符合就留下,不符合就丟棄;

  • using index condition:與Using where類似,查詢的列不完全被索引覆蓋,where條件中是⼀個前導列的範圍;

  • using sort_union(...), Using union(...), Using intersect(.. .):這些函數說明如何為index_merge連接類型合併索引掃描;

  • using index for group-by:類似於存取表的Using index⽅式,Using index for group-by表示資料庫發現了⼀個索引,可以⽤來查詢group by或distinct查詢的所有列,⽽不要額外搜尋硬碟存取實際的表;

  • null:查詢的列未被索引覆蓋,並且where篩選條件是索引的前導列,意味著⽤到了索引,但是部分欄位未被索引覆蓋,必須透過「回表」來實現,不是純粹地⽤到了索引,也不是完全沒⽤到索引,即使用了索引但需要回表操作,應該避免回表操作。

【相關推薦:mysql影片教學

以上是mysql中執行計畫是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn