盡量避免全表掃描:
1.考慮在 where 及 order by 涉及的列上建立索引
2.避免在 where 子句中對(duì)字段進(jìn)行 null 值判斷,可以設(shè)置默認(rèn)值0.
select id from t where num=0圆恤;
3.避免在 where 子句中使用!=;
4.避免在 where 子句中使用 or 來連接條件,可以
select id from t where num=10
union all
select id from t where num=20;
5.in 和 not in 也要慎用;(如果能用Between ...and...)育谬, exists 代替 in 是一個(gè)好的選擇命锄;
6.like '%abc%' 導(dǎo)致全表掃描囱桨;
7.where中使用參數(shù)導(dǎo)致全表掃描,可以強(qiáng)制索引查詢:
select id from t with(index(索引名)) wherenum=@num秀撇;
8.避免在 where 子句中對(duì)字段進(jìn)行表達(dá)式操作超棺,對(duì)字段進(jìn)行函數(shù)操作;
select id from t where num/2=100
應(yīng)改為:
select id from t where num=100*2呵燕;
不要在 where 子句中的“=”左邊進(jìn)行函數(shù)棠绘、算術(shù)運(yùn)算或其他表達(dá)式運(yùn)算,否則系統(tǒng)將可能無法正確使用索引
9.索引:
- 在使用索引字段作為條件時(shí)虏等,如果該索引是復(fù)合索引弄唧,那么必須使用到該索引中的第一個(gè)字段作為條件時(shí)才能保證系統(tǒng)使用該索引,否則
該索引將不會(huì)被使用霍衫,并且應(yīng)盡可能的讓字段順序與索引順序相一致候引。 - 并不是所有索引對(duì)查詢都有效,SQL是根據(jù)表中數(shù)據(jù)來進(jìn)行查詢優(yōu)化的敦跌,當(dāng)索引列有大量數(shù)據(jù)重復(fù)時(shí)澄干,SQL查詢可能不會(huì)去利用索引
- 索引并不是越多越好逛揩,索引固然可以提高相應(yīng)的 select 的效率,但同時(shí)也降低了 insert 及 update 的效率麸俘,因?yàn)?insert 或 update 時(shí)有可能會(huì)重建索引辩稽,所以怎樣建索引需要慎重考慮,視具體情況而定从媚。一個(gè)表的索引數(shù)最好不要超過6個(gè)