不適合建立索引的情況
1. 在查詢(xún)中很少使用的列。
2. 很少數(shù)據(jù)值的列,例如:性別
3. 對(duì)于text启绰,image,bit這樣大數(shù)據(jù)列的字段资昧,因?yàn)檫@些字段數(shù)據(jù)量要么非常大要么很少酬土。
4. 當(dāng)修改性能大于查詢(xún)性能時(shí),不應(yīng)該去建立索引格带。
MySQL優(yōu)化
1. 避免全表掃描,首先應(yīng)在where及order by后面設(shè)計(jì)的列上建立索引刹枉。
2. 因盡量避免在where子句中進(jìn)行null值判斷叽唱,否則將導(dǎo)致引擎放棄索引,進(jìn)行全盤(pán)掃描微宝。
? ? 例如:select * from table where name is null? ?可以將null設(shè)置成默認(rèn)值0
3. 因盡量避免在where子句中使用!= 棺亭,<>。
4. 因盡量避免在where子句中使用or蟋软,因?yàn)閛r是左右兩種要同時(shí)進(jìn)行查詢(xún)镶摘。
? ? 例如:select id from table where num = 1 or num = 3
? ? 改為:select id from table where num = 1
? ? ? ? ? ? ? ? union all
????????????????select id from table where num =3
5. in 和 not in 也要慎用。
select id from table where num in (1,2,3)
對(duì)于連續(xù)的數(shù)值可以使用between ...and
6. 模糊查詢(xún)岳守,like前有%的不會(huì)走索引凄敢。
7. where字句進(jìn)行表達(dá)式運(yùn)算,或者使用函數(shù)都不會(huì)走索引湿痢。
運(yùn)算:select id from table where num/2 = 100不會(huì)走索引
改為:select id from table where num = 100 * 2
函數(shù):select id from table where substring(name, 1, 3) = 'abc'不會(huì)走索引
8. 在使用索引字段作為條件時(shí)涝缝,如果是復(fù)合索引,那么必須使用到該索引中的第一個(gè)字段作為條件時(shí)譬重,才能保證系統(tǒng)使用索引拒逮。
補(bǔ):例如三個(gè)字段num,name, age建立聯(lián)合索引(num_name_age)臀规,實(shí)際可用索引為三種滩援,num,num_name,num_age
9. 使用exists代替(exists執(zhí)行完的返回true或false,true才執(zhí)行外側(cè)語(yǔ)句塔嬉,否則不執(zhí)行玩徊。)
select id from table where num in (select num from table2 )
改為:
select id from table where exists(select 1 from table2 where num = table.num)