接上篇V肼怠D衾!
SQL語(yǔ)句優(yōu)化的一些方法
1.對(duì)查詢進(jìn)行優(yōu)化蔚携,應(yīng)盡量避免全表掃描希太,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索引。
2.應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行 null 值判斷酝蜒,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描誊辉,如:
select id from t where num is null
-- 可以在num上設(shè)置默認(rèn)值0,確保表中num列沒(méi)有null值秕硝,然后這樣查詢:
select id from t where num=
3.應(yīng)盡量避免在 where 子句中使用!=或<>操作符芥映,否則引擎將放棄使用索引而進(jìn)行全表掃描洲尊。
4.應(yīng)盡量避免在 where 子句中使用or 來(lái)連接條件远豺,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:
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
5.in 和 not in 也要慎用坞嘀,否則會(huì)導(dǎo)致全表掃描躯护,如:
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
6.下面的查詢也將導(dǎo)致全表掃描:select id from t where name like ‘%李%’若要提高效率丽涩,可以考慮全文檢索棺滞。
7.如果在 where 子句中使用參數(shù),也會(huì)導(dǎo)致全表掃描矢渊。因?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
8.應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行表達(dá)式操作秒赤,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。如:
select id from t where num/2=100
-- 應(yīng)改為:
select id from t where num=100*2
9.應(yīng)盡量避免在where子句中對(duì)字段進(jìn)行函數(shù)操作憎瘸,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描入篮。如:
select id from t where substring(name,1,3)=’abc’
-- name以abc開頭的id應(yīng)改為:
select id from t where name like ‘a(chǎn)bc%’
10.不要在 where 子句中的“=”左邊進(jìn)行函數(shù)、算術(shù)運(yùn)算或其他表達(dá)式運(yùn)算幌甘,否則系統(tǒng)將可能無(wú)法正確使用索引潮售。
最后,小編分類整理了許多java進(jìn)階學(xué)習(xí)材料和BAT面試給熱愛IT行業(yè)的你锅风,如果需要資料的請(qǐng)轉(zhuǎn)發(fā)此文章后再私聊小編回復(fù)【java】就能領(lǐng)取2019年java進(jìn)階學(xué)習(xí)資料和BAT面試題以及《Effective Java》(第3版)電子版書籍饲做。也可以加群:712263501領(lǐng)取海量學(xué)習(xí)資料進(jìn)行學(xué)習(xí)。