立即學習: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 按照複合索引的順序使用,不要跨列或無序使用。