優化之EXPAIN執行計畫

2021-09-28 21:56:02 字數 4201 閱讀 3881

#準備測試資料

create tableactor(

idint(22) not null auto_increment,

namevarchar(255) default null,

update_timedatetime 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(

idint(22) not null auto_increment,

namevarchar(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(

idint(22) not null auto_increment,

film_idint(22) default null,

actor_idint(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...