1.對查詢進(jìn)行優(yōu)化秋冰,應(yīng)盡量避免全表掃描臭胜,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索引
2.應(yīng)盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描
3.應(yīng)盡量避免在 where 子句中對字段進(jìn)行 null 值判斷,否則將導(dǎo)致引擎放棄使用索引而進(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.應(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
7.不要在 where 子句中的“=”左邊進(jìn)行函數(shù)、算術(shù)運(yùn)算或其他表達(dá)式運(yùn)算俱病,否則系統(tǒng)將可能無法正確使用索引
8.在使用索引字段作為條件時官疲,如果該索引是復(fù)合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統(tǒng)使用該索引亮隙,否則該索引將不會被使用途凫,并且應(yīng)盡可能的讓字段順序與索引順序相一致
9.很多時候用 exists 代替 in 是一個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)
10.并不是所有索引對查詢都有效,SQL是根據(jù)表中數(shù)據(jù)來進(jìn)行查詢優(yōu)化的溢吻,當(dāng)索引列有大量數(shù)據(jù)重復(fù)時维费,SQL查詢可能不會去利用索引,如一表中有字段sex促王,male犀盟、female幾乎各一半,那么即使在sex上建了索引也對查詢效率起不了作用
11.索引并不是越多越好蝇狼,索引固然可以提高相應(yīng)的 select 的效率阅畴,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引迅耘,所以怎樣建索引需要慎重考慮贱枣,視具體情況而定。一個表的索引數(shù)最好不要超過6個颤专,若太多則應(yīng)考慮一些不常使用到的列上建的索引是否有必要
12.盡可能的使用 varchar/nvarchar 代替 char/nchar 纽哥,因為首先變長字段存儲空間小,可以節(jié)省存儲空間栖秕,其次對于查詢來說春塌,在一個相對較小的字段內(nèi)搜索效率顯然要高些。
13.任何地方都不要使用 select * from t ,用具體的字段列表代替“*”摔笤,不要返回用不到的任何字段