SQL --優化小結

對查詢進行優化sql

0.任何地方都不要使用 select * from t_tble,要用具體的字段代替 *號,儘可能不要返回用不到的字段。
數據庫

1.儘可能避免全表掃描,即以下語句
函數

select * from t_test

理論上不會存在如上業務,通常都會帶上where,這樣就快多了。優化

2.儘可能避免在where子句中進行null值判斷,不然容易引發全表掃描,即以下語句設計

select * from t_test tt where tt.num is null

能夠將num的默認值設置成0,確保num的值不會爲null,修改查詢以下code

select * from t_test tt where tt.num = 0

3.儘可能避免在where子句中使用or,如索引

select * from t_test tt where tt.num = 0 or tt.num = 1

能夠修改sql爲以下字符串

select * from t_test tt where tt.num = 0 
union all
select * from t_test tt where tt.num = 1

4.慎用in和not in,如string

select * from t_test tt where tt.num in(1000000000,1000000001,1000000002)

若是in裏面的值是連續的數值,則可使用between來優化io

select * from t_test tt where tt.num between 1000000000 and 1000000002

5.儘可能避免在where子句中對字段進行表達式操做,如

select * from t_test tt where tt.num/2 = 10

修改sql以下

select * from t_test tt where tt.num = 10*2

6.儘可能避免在where子句中對字段進行函數操做,如

//找出以abc開頭的字符串
select * from t_test tt where substring(tt.name,1,3) = 'abc'

修改SQL以下

//找出以abc開頭的字符串
select * from t_test tt where tt.name like 'abc%'

7.有時候使用exists代替in是一個比較好的選擇

select * from t_test tt where tt.num in (select tt2.num from t_test2 tt2)

優化成以下SQL語句

select * from t_test tt where exists (select 1 from t_test2 tt2 where tt2.num = tt.num)

8.索引並非越多越好,建立索引確實能夠提升select的效率,可是同時也下降了insert和update的效率,由於insert和update時有可能須要重建索引。

9.儘可能使用數字型字段,若是隻含有數值型的字段儘可能不要設計成字符型,這樣會下降查詢和鏈接的效率。由於數據庫在處理查詢時會逐個比較字符串中的每個字符,若是是數字類型的話,則不須要轉換,直接比較。

10.儘可能使用varchar代替char,緣由不單單是節省存儲空間,而是對於查詢來講,位數越小,比較越快。

11.儘可能使用表變量來代替臨時表

12.若是使用到了臨時表,在存儲過程的最後必定要將全部的臨時表顯示刪除,先truncate table,再drop table,這樣能夠避免系統表較長時間鎖定。

相關文章
相關標籤/搜索