- 1).在
where
子句中使用!=
或<>
操作符
-
2).在where
子句中對(duì)字段進(jìn)行null
值判斷
如:
select id from t where num is null;
可以在num上設(shè)置默認(rèn)值0,確保表中num列沒(méi)有null值,然后這樣查詢:
select id from t where num=0;
-
3).在where
子句中使用 or 來(lái)連接條件
如:
select id from t where num=10 or num=20;
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20;
-
4).in 和 not in 也要慎用
如:
select id from t where num in(1,2,3);
對(duì)于連續(xù)的數(shù)值,能用between
就不要用in
如:
select id from t where num between 1 and 3;
很多時(shí)候可以用exists
代替in
如:
select num from a where num in(select num from b);
用下面的語(yǔ)句替換:
select num from a where exists(select 1 from b where num=a.num);
-
5).在where
子句中使用參數(shù)
因?yàn)镾QL只有在運(yùn)行時(shí)才會(huì)解析局部變量,但優(yōu)化程序不能將訪問(wèn)計(jì)劃的選擇推遲到運(yùn)行時(shí),它必須在編譯時(shí)進(jìn)行選擇。
如果在編譯時(shí)建立訪問(wèn)計(jì)劃,變量的值還是未知的,因而無(wú)法作為索引選擇的輸入項(xiàng)。
如下面語(yǔ)句將進(jìn)行全表掃描:
select id from t where num=@num;
可以改為強(qiáng)制查詢使用索引:
select id from t with(index(索引名)) where num=@num
-
6).在where
子句中對(duì)字段進(jìn)行函數(shù)、算術(shù)運(yùn)算或其他表達(dá)式運(yùn)算
如:
select id from t where num/2=100;
select id from t where date(createdate)>='2016-07-01';
應(yīng)改為:
select id from t where num=100*2
select id from t where createdate>='2005-11-30 00:00:00';