1.對查詢進行優(yōu)化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
2.應盡量避免在 where 子句中對字段進行 NULL 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
select?id?from?t?where?num?is?null
可以在num上設置默認值0,確保表中num列沒有null值,然后這樣查詢:
select?id?from?t?where?num=0
3.應盡量避免在 where 子句中使用!=或操作符,否則將引擎放棄使用索引而進行全表掃描。
4.應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
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 也要慎用,否則會導致全表掃描,如:
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.下面的查詢也將導致全表掃描:
select?id?from?t?where?name?like?'%abc%'
7.應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select?id?from?t?where?num/2=100
應改為:
select?id?from?t?where?num=100*2
8.應盡量避免在where子句中對字段進行函數(shù)操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select?id?from?t?where?substring(name,1,3)='abc'--name以abc開頭的id
應改為:
select?id?from?t?where?name?like?'abc%'
9.不要在 where 子句中的“=”左邊進行函數(shù)、算術運算或其他表達式運算,否則系統(tǒng)將可能無法正確使用索引。
10.在使用索引字段作為條件時,如果該索引是復合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統(tǒng)使用該索引,
否則該索引將不會被使用,并且應盡可能的讓字段順序與索引順序相一致。
11.不要寫一些沒有意義的查詢,如需要生成一個空表結構:
select?col1,col2?into?#t?from?t?where?1=0
這類代碼不會返回任何結果集,但是會消耗系統(tǒng)資源的,應改成這樣:
create?table?#t(...)