學習筆記(10):MySQL版SQL優化-ref、rows、usingFilesort

立即學習:https://edu.csdn.net/course/play/25283/297146?utm_source=blogtoedu

explain  +sql ;

id 值相同,從上往下順序執行

表的執行順序  因數量的個數改變而改變的原因:笛卡爾積

數據小的表,優先查詢

id值不同:id值越大越優先查詢

 

(2)select_type

primary :包含子查詢SQL中的主查詢(最外層)

SUBQUERY:包含子查詢SQL中的子查詢(非最外層)

simple:簡單查詢(不包含子查詢、union)

derived:衍生查詢(使用到了臨時表)

  a.在from 子查詢中只有一張表

  b.在from子查詢中,如果有table1 union table2,則table1 就是derived  table2 就是union

 

union  result 表(不常見):告知開發人員,那些表之間存在union查詢

system >const > eq_ref >ref> fulltext >ref_or_null >index_merge >  unique_subquery >index_

 

(3)type:索引類型、類型

system >const > eq_ref >ref>range>index>all       要對type進行優化的前提:有索引

其中:system ,const 只是理想情況;實際能達到ref>range

 

system(忽略):只有一條數據的系統:或衍生表只有一條數據的主查詢

 

增加索引:

alter table test01 add constraint tid_pk primary key(tid);

 

const:僅僅能查到一條數據的SQL,用於Primary key 或unique索引(類型與索引類型有關)

eq_ref :唯一性索引;對於每個索引建的查詢,返回匹配唯一行數據(有且只有一個,不能多、不能0)

常見於唯一索引和主鍵索引。

alter table teacherCard add constraint pk_tcid primary key(tcid);

 

alter table teacher add constraint uk_tcid  unique index(tcid);

 

 range :檢索指定範圍的行,where 後面是一個範圍查詢(between ,> <>=,   特殊:in有時候會失效,從而轉爲無索引all )

 

index:查詢全部索引中數據

   只需要掃描索引表,不需要所有表中的所有數據

 

all:查詢全部數據

需要全表所有,即需要所有表中的所有數據

 

system/const:結果只有一條數據

eq_ref:結果多條,但是每條數據是唯一的;

ref:結果多條;但是每條數據是0條或多條;

(4)possible_keys:可能用到的索引,是一種預測,不準。

 

如果possible_key  /key 是NULL,則說明沒用索引

(5)key:實際使用到的索引

(6)key_len:索引的長度  作用:用於判斷複合索引受被完全使用。

create table test_k1(

 name char(20) not null default ''

);

alter table test_kl add index index_name(name);

 

utf8:1個字符3個字節

gbk:1個字符2個字節

latin:1個字符1個字節

(7)ref:注意與type中的ref值區分。

作用:指明當前表所參照的字段。

(8)rows:被索引優化查詢的  數據個數(實際通過索引而查詢到的  數據個數)

(9)Extra(其它) :

using  filesort:性能消耗大;需要“額外”的一次排序(查詢)

排序:先查詢

 

小結:對於單索引,如果排序和查找

是同一個字段,則不會出現using filesort;如果排序和查找不是同一個字 段,反之則。。

 

避免:where 那些字段,就order by 那些字段

複合索引:不能跨列(最佳左前綴)

 

避免:where和order by 按照複合索引的順序使用,不要跨列或無序使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章