1. 程式人生 > >不給失敗找藉口,只給成功想辦法

不給失敗找藉口,只給成功想辦法

最近資料庫課程設計,我總結了一下資料庫的優化方法,希望對有需要的人能有幫助:微笑
1.對查詢進行優化,儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
2.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
    select id from p where num is null
 可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:
    select id from p where num=0

3.應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。

4.應儘量避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃描,如:

    select id from p where num=8 or num=12
  可以這樣查詢:
    select id from p where num=8
    union all
    select id from p where num=12
5.in 和 not in 也要慎用,否則會導致全表掃描,如:
    select id from p where num in(1,2,3)
對於連續的數值,能用 between 就不要用 in 了:
    select id from p where num between 1 and 3
6.下面的查詢也將導致全表掃描:
   select id from p where name like '%abcd%'
  若要提高效率,可以考慮全文檢索。

7.如果在 where 子句中使用引數,也會導致全表掃描。因為SQL只有在執行時才會解析區域性變數,但優化程式不能將訪問計劃的選擇推遲到執行時;它必須在編譯時進行選擇。然而,如果在編譯時建立訪問計劃,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:

    select id from p where [email protected]
可以改為強制查詢使用索引:
    select id from p with(index(索引名)) where num= @number
8.應儘量避免在 where 子句中對欄位進行表示式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
    select id from t where num/2=10
應改為:
select id from t where num=10*2
9.應儘量避免在where子句中對欄位進行函式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)='abc'--name以abc開頭的id
  select id from t where datediff(day,createdate,'2014-12-30')=0--‘2014-12-30’生成的id

10.主鍵是必要的,SQL SERVER的主鍵同時是一個唯一索引,而且在實際應用中,我們往往選擇最小的鍵組合作為主鍵,所以主鍵往往適合作為表的聚集索引。在有多個鍵的表,主鍵的選擇也比較重要,一般選擇總的長度小的鍵,小的鍵的比較速度快,同時小的鍵可以使主鍵的B樹結構的層次更少。主鍵的選擇還要注意組合主鍵的欄位次序,對於組合主鍵來說,不同的欄位次序的主鍵的效能差別可能會很大,一般應該選擇重複率低、單獨或者組合查詢可能性大的欄位放在前面。

11.資料型別儘量用數字型,數字型的比較比字元型的快很多。

12.資料型別儘量小,這裡的儘量小是指在滿足可以預見的未來需求的前提下的。

13.儘量不要允許NULL,除非必要,可以用預設值代替。

14.少用TEXT和IMAGE,二進位制欄位的讀寫是比較慢的,而且,讀取的方法也不多,大部分情況下最好不用。

15.自增欄位要慎用,不利於資料遷移。

16.適用檔案組可以有效把I/O操作分散到不同的物理硬碟,提高併發能力。

17.一個表不要加太多索引,因為索引影響插入和更新的速度。

18.適當的使用冗餘的反正規化設計,以空間換時間有的時候會很高效。

19.聯表查詢的時候,記得把小結果集放在前面,遵循小結果集驅動大結果集的原則。

20.查詢儘可能使用limit減少返回的行數,減少資料傳輸時間和頻寬浪費。