1.對查詢進(jìn)行優(yōu)化淑廊,應(yīng)盡量避免全表掃描盖彭,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索引。
2.應(yīng)盡量避免在 where 子句中對字段進(jìn)行 null 值判斷澳化,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:
select id from t where num is null
可以在num上設(shè)置默認(rèn)值0稳吮,確保表中num列沒有null值缎谷,然后這樣查詢:
select id from t where num=0
3.應(yīng)盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描。
4.應(yīng)盡量避免在 where 子句中使用 or 來連接條件列林,否則將導(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 也要慎用,否則會導(dǎo)致全表掃描希痴,如:
select id from t where num in(1者甲,2,3)
對于連續(xù)的數(shù)值砌创,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
6.下面的查詢也將導(dǎo)致全表掃描:
select id from t where name like '%abc%'
若要提高效率虏缸,可以考慮全文檢索。
7.如果在 where 子句中使用參數(shù)嫩实,也會導(dǎo)致全表掃描刽辙。因?yàn)镾QL只有在運(yùn)行時才會解析局部變量,但優(yōu)化程序不能將訪問計劃的選擇推遲到運(yùn)行時;它必須在編譯時進(jìn)行選擇甲献。然而宰缤,如果在編譯時建立訪問計劃,變量的值還是未知的晃洒,因而無法作為索引選擇的輸入項(xiàng)慨灭。如下面語句將進(jìn)行全表掃描:
select id from t wherenum=@num
可以改為強(qiáng)制查詢使用索引:
select id from t with(index(索引名)) wherenum= @num
8.應(yīng)盡量避免在 where 子句中對字段進(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子句中對字段進(jìn)行函數(shù)操作氧骤,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。如:
select id from t where substring(name桶略,1语淘,3)='abc'
name以abc開頭的id
select id from t where datediff(day,createdate际歼,'2005-11-30')=0
‘2005-11-30’生成的id
下面給大家共享一篇美團(tuán)技術(shù)大牛的文章:MySQL索引原理及慢查詢優(yōu)化