mysql中執行計劃是什麼

2022-11-11 22:00:43

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

程式設計師必備介面測試偵錯工具:

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

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

一、什麼是執行計劃

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

  • 展示表的讀取順序;

  • 資料讀取操作的型別;

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

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

  • 表之間的參照關係;

  • 每張表被查詢的行數。

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

二、如何使用執行計劃

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

三、執行計劃資訊

1.png

從圖中可以看出,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:表示查詢的表名,可以有以下幾種情況:

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

  • <derivenN>:表示查詢的條件是一個子查詢;

  • <union1,2>:表示表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篩選條件是索引的前導列,意味著⽤到了索引,但是部分欄位未被索引覆蓋,必須通過「回表」來實現,不是純粹地⽤到了索引,也不是完全沒⽤到索引,即使用了索引但需要回表操作,應該避免回表操作。

相關推薦:《Linux視訊教學

以上就是mysql中執行計劃是什麼的詳細內容,更多請關注TW511.COM其它相關文章!