#準備測試資料
create tableactor
(
id
int(22) not null auto_increment,
name
varchar(255) default null,
update_time
datetime default null,
primary key (id
)
) engine=innodb auto_increment=4 default charset=utf8;
insert intoactor
(id
,name
,update_time
) values (1,『a』,『2019-10-21 14:03:45』),(2,『b』,『2019-10-22 14:03:49』),(3,『c』,『2019-10-23 14:03:52』);
create tablefilm
(
id
int(22) not null auto_increment,
name
varchar(255) default null,
primary key (id
)
) engine=innodb auto_increment=4 default charset=utf8;
insert intofilm
(id
,name
) values (1,『film1』),(2,『film2』),(3,『film0』);
create tablefilm_actor
(
id
int(22) not null auto_increment,
film_id
int(22) default null,
actor_id
int(22) default null,
primary key (id
)
) engine=innodb auto_increment=4 default charset=utf8;
insert intofilm_actor
(id
,film_id
,actor_id
) values (1,1,1),(2,1,2),(3,2,1);
一. explain 之 id
explain select (select 1 from actor where id = 1)
from (select * from film where id = 1) der;
三種情況
1.id相同,表示載入表的順序是從上到下
2.id不同,值越大優先順序越高,越先執行
3.id有相同也有不同,id相同的可以認為是一組,從上往下執行,在所有組中,id值越大,優先順序越高,越先執行。
二. explain 之 select type
explain select * from film;
explain
select (select 1 from actor where id = 1)
from (select * from film where id = 1 union select * from film where id = 1) der;
****** :簡單select查詢,查詢中不包含子查詢或union
primary :複雜查詢中最外層的select
derived : 包含在from子句中的子查詢。派生出一張表臨時存放子查詢的結果集
union : 在union中的第二個隨後的select並集去重查詢
union result :從union臨時表檢索結果的select,並集去重查詢後派生出一張臨時表所存放的結果
subquery: :包含在select中的查詢,子查詢
三. explain 之 table
從哪個表中讀取資料
四. explain 之 partitions
分割槽表如果沒有設定分割槽的話,則為null
五. explain 之 type
explain select * from (select * from film where id = 1) tmp;
explain select * from film_actor left join film on film_actor.film_id
= film.id
;
explain select * from actor where id > 1;
explain select count(0) from film;
explain select * from actor;
type 含義:關聯型別或訪問型別,mysql決定如何查詢表中的行
null mysql不訪問任何表,索引,直接返回結果
system 表只有一行記錄(等於系統表),這是const型別的特例,一般不會出現
const 表示通過索引一次就找到了,const 用於比較primary key 或者 unique 索引。因為只匹配一行資料,所以很快。
如將主鍵置於where列表中,mysql 就能將該查詢轉換為乙個常量。const於將"主鍵" 或 「唯一」 索引的所有部分與常量值進行比較
eq_ref 類似ref,區別在於使用的是唯一索引,使用主鍵的關聯查詢,關聯查詢出的記錄只有一條。常見於主鍵或唯一索引掃瞄
ref 非唯一性索引掃瞄,返回匹配某個單獨值的所有行。本質上也是一種索引訪問,返回所有匹配某個單獨值的所有行(多個)
range 只檢索給定返回的行,使用乙個索引來選擇行。 where 之後出現 between , < , > , in 等操作。
index index 與 all的區別為 index 型別只是遍歷了索引樹, 通常比all 快, all 是遍歷資料檔案。
all 將遍歷全表以找到匹配的行
結果值從最好到最壞依次是:
最好 system > const > eq_ref > ref > range > index > all 最壞
六. explain 之 possible_keys(可能)
顯示查詢可能使用哪些索引來查詢
七. explain 之 key(實際)
顯示mysql實際採用哪個索引來優化對該錶的訪問
八. explain 之 key_len
顯示mysql在索引李使用的位元組數,通過這個值可以算出具體使用了索引中的那個列
九. explain 之 ref
這一列顯示了在key列記錄的索引中,表查詢值所用到的列或常量
十. explain 之 rows
mysql估計要讀取並檢測的行數,這個不是結果集的行數
十一. explain 之 filtered
是乙個百分比的值, rows * filtered / 100 這個結果將與前表產生互動
十二. explain 之 extra
在這裡插入描述
explain select distinct name from film left join film_actor on film.id = film_actor.film_id
;
explain select id from film order by id;
explain select * from film where id > 1;
explain select * from actor order by name;
展示的額外資訊
distinct 一
旦mysql找到了與行相關聯匹配的行,就不再搜尋了
using index 發生在對錶的請求列都是同一索引的部分的時候,返回的列資料只使用了索引中的資訊,而沒有再去訪問表中的杭機路, 是效能高的表現。
using where mysql伺服器將在儲存引擎檢索行後再進行過濾,就是先讀取整行資料,再按照where條件進行檢查,符合就留下,不符合就丟棄。
using temporary 使用臨時表來中間操作。效率低下,解決: 為查詢的列建立索引
using filesort 採用檔案掃瞄對結果進行計算排序,效率低下 解決: order by 的列要出現在select欄位中。
mysql之expain執行計畫詳解
mysql之expain執行計畫詳解 explain select from user where name 張三 expain出來的資訊有12列,分別是id select type table partitions type possible keys key key len ref rows f...
mysql優化之執行計畫
mysql是乙個關係型資料庫管理系統,由瑞典mysql ab公司開發,目前屬於oracle旗下產品。mysql是最流行的關係型資料庫管理系統之一,在web應用方面,mysql是最好的rdbms應用軟體之一 mysql資料庫根據應用的需要準備了不同的引擎,不同的引擎側重點不一樣 mysql的儲存引擎介...
sql優化之獲取執行計畫
獲取執行計畫的方法 1,執行sql語句的explain plan,查詢結果輸出表 explain for statement 需要statement涉及到的基礎表和檢視的訪問許可權 可以用dbms xplan.display查詢執行計畫表 2,查詢動態效能檢視 v sql plan和v sql pl...