Explain分析執行計畫

2021-10-01 13:53:42 字數 2498 閱讀 1691

mysql將select查詢分為簡單查詢(******)和複雜查詢(primary)。

複雜查詢又分為三類:簡單子查詢(subquery),派生表(from語句中的子查詢,derived),union查詢(union)。

例如:

各屬性如下:

還有ref列

這一列顯示了在key列記錄的索引中,表查詢值所用到的列或常量,常見的有:const(常量),欄位名(例:film.id)

explain之id

id欄位是select查詢的順序號。

id值越大越先執行,相同則順序執行,id為null最後執行。

explain之select_type

表示select查詢型別。

常見的取值如下表:

從上到下效率越來越低

explain之table

這一列表示explain的一行正在訪問那個表。

當from子句中又子查詢時,table為,n=id

當有union時,table為1和2表示參加union查詢的行id

explain之type這一列表示關聯型別或訪問型別,即mysql決定如何查詢表中的行,查詢資料記錄的大概範圍。一般來說,得保證查詢達到range級別,最好達到ref。

從上到下效率越來越低。

是較為重要的乙個指標,可取值為:

null:表示不需要訪問任何表而得到結果

const:表示通過索引一次就能找到,用於比較主鍵或者唯一索引,只有一條資料

system:表只有一行記錄(等於臨時表),這是const型別的特列,一般不會出現

eq_ref:類似於ref,區別在於使用得是唯一索引,使用主鍵關聯查詢,關聯查詢出得記錄只有一條。常見於主鍵或唯一索引掃瞄

ref:非唯一索引掃瞄,返回匹配某個單獨值得所有行。

range:範圍掃瞄通常出現在 in(), between ,> ,= 等操作中。使用乙個索引來檢索給定範圍的行。

index:只遍歷所有樹

all:全表掃瞄

explain之key

possible_key:顯示可能應用在這張表的索引,乙個或多個。

key:實際使用的索引,如果為null,則沒有使用索引。

key_len:表示索引中使用的位元組數,該值為索引字段最大可能長度,並非實際使用長度,在不損失精確性的前提下,長度越短越號。

explain之rows

掃瞄行的數量。
explain之extra這一列展示的是額外的資訊

其他的二外的執行計畫訊息,在該列展示。

using index:查詢的列被索引覆蓋,並且where篩選條件是索引的前導列(即聯合索引的第乙個索引),是效能高的表現。一般是使用了覆蓋索引(索引包含了所有查詢的字段)

using where:查詢的列未被索引覆蓋,where篩選條件非索引的前導列。

using where using index:查詢的列被索引覆蓋,並且where篩選條件是索引列之一但不是索引的前導列,意味著無法直接通過索引查詢來查詢到符合條件的資料

null:查詢的列未被索引覆蓋,並且where篩選條件是索引的前導列,意味著用到了索引,但是部分欄位未被索引覆蓋,必須通過「回表」來實現,不是純粹地用到了索引,也不是完全沒用到索引

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

using temporary:mysql需要建立一張臨時表來處理查詢。出現這種情況一般是要進行優化地,首先想到的是用索引來優化。

using filesort:mysql會對結果使用乙個外部索引排序,而不是按索引次序從表李讀取行。此時mysql會根據聯接型別瀏覽所有符合條件的記錄,並儲存排序關鍵字和行指標,然後排序關鍵字並按順序檢索行資訊。這種情況下一般也是要考慮使用索引來優化的。

explain執行計畫分析

1.explain通過分析執行計畫的結果來分析查詢語句或表結構的效能瓶頸。1 表讀取的順序 2 資料讀取操作的操作型別 3 可以使用索引 4 實際使用索引 5 表與表之間的引用資訊 6 有多少行被查詢 2.執行計畫結果字段含義 1 id 該欄位表示執行select子句或操作表的順序,分為三種情況 i...

EXPLAIN執行計畫

create table employee eid int auto increment,ename varchar 32 age int,salary float,mid int,primary key eid key ename,age create table manager mid int,...

explain執行計畫

sql執行計畫 id 用來看查詢了幾次,或者有幾個select。但是這個不一定準確,因為 select from a inner join b on a.id b.id 這個語句有乙個select,但是實際上查詢了兩個表。因此還是要看查詢了幾張表 包括衍生表 type 這個字段用來描述本次查詢的效能...