隨著石家莊網(wǎng)站建設(shè)網(wǎng)站的使用時間越來越久,網(wǎng)站數(shù)據(jù)的存儲量越來越大,服務(wù)器的性能需要更好地去優(yōu)化,才能保證網(wǎng)站更優(yōu)秀地運行。近日,我們在網(wǎng)上找了好多關(guān)于SQL優(yōu)化的教程,感覺這篇教程講的很詳細,效果更為明顯?,F(xiàn)在推薦給大家,大家一起學(xué)習(xí),一起進步。

網(wǎng)上關(guān)于數(shù)據(jù)庫優(yōu)化的教程有很多,但是又多又亂的。最近因為服務(wù)器需要優(yōu)化一下,所以從網(wǎng)上整理了一些,寫出來跟大家分享一下,有什么不對和不足的地方,還請大家糾正補充。這篇文章我花費了大量的時間查找資料、修改、排版,希望大家閱讀之后,感覺好的話推薦給更多的人,讓更多的人看到、學(xué)習(xí)、糾正補充。
1.盡量避免在 where 子句中使用 or 來連接條件,如果一個字段有索引,一個字段沒有索引,將導(dǎo)致引擎放棄使用索引而進行全表掃描,如:
select id from t where num=10 or Name = 'admin'
可以這樣查詢:
select id from t where num = 10
union all
select id from t where Name = 'admin'
2.盡量避免在 where 子句中對字段進行 null 值判斷,否則將導(dǎo)致引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null
最好不要給數(shù)據(jù)庫留NULL,盡可能的使用 NOT NULL填充數(shù)據(jù)庫.
備注、描述、評論之類的不重要的可以設(shè)置為 NULL,其他的,最好不要使用NULL。不要以為 NULL 不需要占用空間,比如:char(100) 型,在字段建立時,空間就固定了, 不管是不是插入值(NULL也包含在內(nèi)),都是占用 100個字符的空間的,如果是varchar這樣的變長字段, null 不占用空間??梢栽?/font>num上設(shè)置默認值0,確保表中num列沒有null值,然后這樣查詢:
select id from t where num = 0
3.應(yīng)盡量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進行全表掃描。
4.適當(dāng)?shù)臅r候應(yīng)該考慮在 where 及 order by 涉及的列上建立索引。以提高查詢速度。
5.下面的查詢也會導(dǎo)致全表掃描:
select id from t where name like ‘%abc%’
若要提高效率,可以考慮全文檢索的哦。
6.in 和 not in 也要慎用,否則也會導(dǎo)致全表掃描。
7.應(yīng)盡量避免在where子句中對字段進行函數(shù)操作,這將導(dǎo)致引擎放棄使用索引,而進行全表掃描。如:
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
應(yīng)改為:
select id from t where name like 'abc%'
select id from t where createdate >= '2005-11-30' and createdate < '2005-12-1'
8.假如在 where 語句中使用參數(shù),也會導(dǎo)致全表掃描。因為SQL只有在石家莊網(wǎng)站建設(shè)運行時才會解析局部變量,但優(yōu)化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然而,如果在編譯的時候建立訪問計劃,變量的值還是未知的,因而無法作為索引選擇的輸入項。比如下面的語句將會進行全表掃描:
select id from t where num = @num
可以改為強制查詢使用索引:
select id from t with(index(索引名)) where num = @num
應(yīng)該盡量避免在 where 子句中對字段進行表達式操作,這會使引擎放棄使用索引而進行全表掃描。比如:
select id from t where num/2 = 100
應(yīng)改為:
select id from t where num = 100*2
好了,就到這里吧。預(yù)知后事如何,請聽下回分解。后面有時間會介紹一些SQL優(yōu)化工具給大家。石家莊網(wǎng)站建設(shè)同您一起學(xué)習(xí),一起進步!