對查詢進行優化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,這樣能夠避免系統表較長時間鎖定。