mysql之explain詳解(分析索引的最佳使用)

在這裏對explain的各個字段進行詳細的分析,來幫助你們分析本身所寫的sql是否最佳的使用了索引。mysql

 

首先是select_type:將select查詢分爲簡單(simple)和複雜兩種類型sql

複雜類型又分爲子查詢(subquery)和from列表中包含子查詢(drived)服務器

simple:優化

drived:blog

就type進行詳細的介紹:排序

System,const,eq_ref,ref,range,index,all索引

all : 即全表掃描table

index : 按索引次序掃描,先讀索引,再讀實際的行,結果仍是全表掃描,主要優勢是避免了排序。由於索引是排好的。file

range:以範圍的形式掃描。select

explain select * from a where a_id > 1\G

ref:非惟一索引訪問(只有普通索引)

create table a(a_id int not null, key(a_id));

insert into a values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

mysql> explain select * from a where a_id=1\G

eq_ref:使用惟一索引查找(主鍵或惟一索引)

const:常量查詢

在整個查詢過程當中這個表最多隻會有一條匹配的行,好比主鍵 id=1 就確定只有一行,只需讀取一次表數據便能取得所需的結果,且表數據在分解執行計劃時讀取。

當結果不是一條時,就會變成index或range等其餘類型

system:系統查詢

null:優化過程當中就已經獲得結果,不在訪問表或索引

possible_keys:可能用到的索引

key:實際用到的索引

key_line:索引字段最大可能使用長度

ref:

指出對 key 列所選擇的索引的查找方式,常見的值有 const, func, NULL, 具體字段名。當 key 列爲 NULL ,即不使用索引時,此值也相應的爲 NULL 。

rows:估計須要掃描的行數

Extra:顯示以上信息以外的其餘信息

Using index

此查詢使用了覆蓋索引(Covering Index),即經過索引就能返回結果,無需訪問表。

若沒顯示"Using index"表示讀取了表數據。

Using where

表示 MySQL 服務器從存儲引擎收到行後再進行「後過濾」(Post-filter)。所謂「後過濾」,就是先讀取整行數據,再檢查此行是否符合 where 句的條件,符合就留下,不符合便丟棄。由於檢查是在讀取行後才進行的,因此稱爲「後過濾」。

Using temporary

使用到臨時表

建表及插入數據:

create table a(a_id int, b_id int);

insert into a values(1,1),(1,1),(2,1),(2,2),(3,1);

mysql> explain select distinct a_id from a\G
        Extra: Using temporary

MySQL 使用臨時表來實現 distinct 操做。

 

Using filesort

若查詢所需的排序與使用的索引的排序一致,由於索引是已排序的,所以按索引的順序讀取結果返回,不然,在取得結果後,還須要按查詢所需的順序對結果進行排序,這時就會出現 Using filesort 。

select * from a order by id;

對於沒有索引的列進行order by 就會出現filesort

相關文章
相關標籤/搜索