您好,登錄后才能下訂單哦!
這篇文章主要講解了“mysql執行計劃指的是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“mysql執行計劃指的是什么”吧!
在mysql中,執行計劃是數據庫提供給用戶的一套對sql語句進行解析、分析、優化功能的工具。執行計劃的作用有:1、展示表的讀取順序;2、數據讀取操作的類型;3、展示哪些索引是可以使用的;4、展示哪些索引是實際上使用的;5、展示表之間的引用關系;6、展示每張表被查詢的行數。
在數據庫查詢的時候,我們通常會使用sql語句去查詢自己所需要的數據。但是,關于sql在數據庫中是如何執行的,它有沒有使用索引,具體使用了哪些索引,查找了哪些字段和表,他們的順序是怎樣的,分別用時多少等等信息我們不得而知,那么有沒有什么方法可以看到這些信息,mysql給我們提供了一套工具——執行計劃。
執行計劃是數據庫提供給我們的一套對sql語句進行解析、分析、優化功能的工具,他具有以下的作用:
展示表的讀取順序;
數據讀取操作的類型;
哪些索引是可以使用的;
哪些索引是實際上使用的;
表之間的引用關系;
每張表被查詢的行數。
注意:執行計劃只是數據庫針對sql給出最佳的優化參考方案,并不一定是最優解,即不要過度相信執行計劃
使用執行計劃很簡單,在要執行的sql前面加上關鍵詞explain即可。
從圖中可以看出,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篩選條件是索引的前導列,意味著?到了索引,但是部分字段未被索引覆蓋,必須通過“回表”來實現,不是純粹地?到了索引,也不是完全沒?到索引,即使用了索引但需要回表操作,應該避免回表操作。
感謝各位的閱讀,以上就是“mysql執行計劃指的是什么”的內容了,經過本文的學習后,相信大家對mysql執行計劃指的是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。