1.索引分析
單表索引
where后面的查詢字段card已經(jīng)添加了索引idx_class_card
兩表索引
left join 左表全都有,右表關(guān)聯(lián)字段添加索引
right join 右表全都要有要出,左表關(guān)聯(lián)字段添加索引
三表索引
索引要設(shè)置在經(jīng)常查詢的字段上
2.索引失效
test03表作為測試表
-
全值匹配我最愛
where后面的查詢字段與復(fù)合索引一一匹配上捷兰,c1,c2,c3,c4和復(fù)合索引idx_test03_c1234
image-20200511035725036 -
最佳左前綴法則
復(fù)合索引的第一個字段一定不能丟失,否則索引失效
c1是復(fù)合索引第一個字段,沒有它,type從ref變?yōu)锳LL,idx_test03_c1234索引失效
image-20200511040402161 -
不在索引列上做任何操作(計算固阁、函數(shù)壤躲、(自動or手動)類型轉(zhuǎn)換),會導(dǎo)致索引失效而轉(zhuǎn)向全表掃描
where后面的索引列c1使用了left函數(shù)后,idx_test03_c1234索引失效,type從ref變?yōu)锳LL
image-20200511040936570 -
存儲引擎不能使用索引中范圍條件右邊的列
where后面c2>'a2'使用了>,type從ref變?yōu)閞ange,從key_len可以看出只有c1,c2有效,c3無效,范圍之后索引無效
image-20200511041256367 -
盡量使用覆蓋索引(只訪問索引的查詢(索引列和查詢列一致))备燃,減少select*
select * 的Extra為NULL,而使用具體字段名的Extra則為Using index,使用了覆蓋索引(Covering Index)
覆蓋索引是select的數(shù)據(jù)列只用從索引中就能夠取得碉克,不必讀取數(shù)據(jù)行,換句話說查詢列要被所建的索引覆蓋并齐。
image-20200511041736322 -
mysql在使用不等于(漏麦!=或者<>)的時候無法使用索引會導(dǎo)致全表掃描
where后面查詢字段c2使用了!=或者<>,type從ref變?yōu)锳LL,key變?yōu)镹ULL,索引失效
image-20200511042345614 is null,is not null 也無法使用索引
-
like以通配符開頭('$abc...')mysql索引失效會變成全表掃描操作
where后面的c1使用%1%,type從ref變成ALL,
c2使用%2%,只有c1索引有效,c2及之后的索引統(tǒng)統(tǒng)失效
如果把%放后面,索引有效,type從ref變成range
image-20200511043216418 -
字符串不加單引號索引失效
where之后c1='1',使用varchar類型,使用了索引
c1=1,mysql優(yōu)化器會自動根據(jù)字段類型(varchar)轉(zhuǎn)為'1',然后進(jìn)行查找,自動轉(zhuǎn)換使索引失效
image-20200511043704818 -
少用or,用它連接時會索引失效
where后面c1='a1' or c2='a2',查詢條件使用or連接,type從ref變成ALL,key變?yōu)镹ULL,索引失效
image-20200511044003254
3.總結(jié)
全值匹配我最愛,最左前綴要遵守;
帶頭大哥不能死,中間兄弟不能斷;
索引列上少計算,范圍之后全失效;
LIKE百分寫最右,覆蓋索引不寫星;
不等空值還有or,索引失效要少用;
VAR引號不可丟,SQL高級也不難.