id
id列的編號是select的序號,有幾個select就有幾個id,並且id的順序是按select出現的順序增長的。id列越大執行優先順序越高,id相同則從上往下執行,id為null最後執行
select_type :表示對應行是簡單還是複雜查詢
******:簡單查詢,查詢不包含子查詢和union
primary:複雜查詢中最外層的select
subquery:包含在select中的子查詢(不再from中)
derived:包含在from子句中的子查詢。mysql會將結果存放在乙個臨時表中,也稱為派生表
union:在union中的第二個和隨後的select
table:查詢的那個表,dervied3,dervied就是select_type的derived,3就是對應的id
type:表示關聯型別或訪問型別,即mysql決定如何查詢表中的行,查詢資料行記錄的大概範圍
依次從最優到最差:system > const > eq_ref > ref > range > index > all 一般來說,得保證查詢達到range級別,最好達到ref
system和const 是根據主鍵來查詢的,查詢的結果<=1,因為一次只會返回一行
eq_ref 在任何關聯的查詢的時候用的是主鍵索引,因為一次只會返回一行
ref 關聯的時候不是使用的唯一索引,因為不是唯一索引,那麼查出來的會有很多行
range 使用索引範圍查詢,in between
index: 掃瞄全表索引,他通常比all快一些,就是select 後面的字段全是索引字段
all 全表掃瞄,意味著mysql需要從頭到尾去查詢所有需要的行,通常情況下這種情況就需要加索引來優化了
possible_keys 可能會用到的索引,並不一定會真的用到。預估用到的索引
key 查詢中真正用到的索引
key_len 索引的長度,若果是聯合索引,可以用它判斷出用的那個索引。
計算規則:char(n):n * 位元組型別長度
varcahr(n):兩位元組儲存字串長度,如果是utf-8,則 3n + 2
......
ref:真正用到的索引是什麼,如果是唯一索引那麼就是常量(cost),如果是不同索引那麼就是欄位名
row:mysql估計要讀取並檢測的行數,注意這不是結果集裡的行數
extra:這一列展示額外資訊
using index:使用覆蓋索引(就是查詢的字段都是索引)
using where: 使用where語句來處理結果,查詢的列未被索引覆蓋 需要優化
using index condition: 查詢的列不完全被索引覆蓋,,where條件中是乙個前導列的範圍
using temporary:mysql會建立臨時表,影響效能,建議建立索引,需要優化
using filesort:將用外部排序而不是索引排序,資料較小時從記憶體排序,否則需要在磁碟完成排序,需要優化
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 這個字段用來描述本次查詢的效能...
MySQL 執行計畫EXPLAIN
mysql 提供了乙個 explain 命令,它可以對 select 語句進行分析,並輸出 select 執行的詳細資訊,以供開發人員針對性優化。使用explain這個命令來檢視乙個這些sql語句的執行計畫,檢視該sql語句有沒有使用上了索引,有沒有做全表掃瞄,這都可以通過explain命令來檢視。...