資料庫效能優化二 資料庫表優化

2021-07-07 02:54:57 字數 3592 閱讀 2483

優化①:設計規範化表,消除資料冗餘

資料庫正規化是確保資料庫結構合理,滿足各種查詢需要、避免資料庫操作異常的資料庫設計方式。滿足正規化要求的表,稱為規範化表,正規化產生於20世紀

70年代初,一般表設計滿足前三正規化就可以,在這裡簡單介紹一下前三正規化

第一正規化(1nf

)無重複的列

所謂第一正規化(1nf

)是指在關係模型中,對域新增的乙個規範要求,所有的域都應該是原子性的,即資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項。   

第二正規化(2nf

)屬性

在1nf

的基礎上,非碼屬性必須完全依賴於碼[在

1nf基礎上消除非主屬性對主碼的部分函式依賴]

第三正規化(3nf

)屬性

在1nf

基礎上,任何非主屬性不依賴於其它非主屬性[在

2nf基礎上消除傳遞依賴]

通俗的給大家解釋一下(可能不是最科學、最準確的理解)

第一正規化:屬性(字段

)的原子性約束,要求屬性具有原子性,不可再分割;

第二正規化:記錄的惟一性約束,要求記錄有惟一標識,每條記錄需要有乙個屬性來做為實體的唯一標識。

第三正規化:屬性(字段

)冗餘性的約束,即任何字段不能由其他字段派生出來,在通俗點就是:主鍵沒有直接關係的資料列必須消除(

消除的辦法就是再建立乙個表來存放他們,當然外來鍵除外)

如果資料庫設計達到了完全的標準化,則把所有的表通過關鍵字連線在一起時,不會出現任何資料的複本(repetition)

。標準化的優點是明顯的,它避免了資料冗餘,自然就節省了空間,也對資料的一致性

(consistency)

提供了根本的保障,杜絕了資料不一致的現象,同時也提高了效率。

優化②:適當的冗餘,增加計算列

資料庫設計的實用原則是:在資料冗餘和處理速度之間找到合適的平衡點 

滿足正規化的表一定是規範化的表,但不一定是最佳的設計。很多情況下會為了提高資料庫的執行效率,常常需要降低正規化標準:適當增加冗餘,達到以空間換時間的目的。比如我們有乙個表,產品名稱,單價,庫存量,總價值。這個表是不滿足第三正規化的,因為「總價值」可以由「單價

」乘以「數量

」得到,說明「金額」

是冗餘字段。但是,增加

「總價值」這個冗餘字段,可以提高查詢統計的速度,這就是以空間換時間的作法。合理的冗餘可以分散資料量大的表的併發壓力,也可以加快特殊查詢的速度,冗餘字段可以有效減少資料庫表的連線,提高效率。

其中"總價值"就是乙個計算列,在資料庫中有兩種型別:資料列和計算列,資料列就是需要我們手動或者程式給予賦值的列,計算列是源於表中其他的資料計算得來,比如這裡的"總價值"

在sql

中建立計算列:

create table table1

(number decimal(18,4),

price money,

amount as number*price --這裡就是計算列

) 也可以再表設計中,直接手動新增或修改列屬性即可:如下圖

是否永續性,我們也需要注意:

如果是'否',說明這列是虛擬列,每次查詢的時候計算一次,而且那麼它是不可以用來做check,foreign key

或not null

約束。 

如果是'是',就是真實的列,不需要每次都計算,可以再此列上建立索引等等。

優化③:索引

索引是乙個表優化的重要指標,在表優化中占有極其重要的成分,所以將單獨寫一章」sql

索引一步到位「去告訴大家如何建立和優化索引

優化④:主鍵和外來鍵的必要性

主鍵與外來鍵的設計,在全域性資料庫的設計中,占有重要地位。 因為:主鍵是實體的抽象,主鍵與外來鍵的配對,表示實體之間的連線。

主鍵:根據第二正規化,需要有乙個欄位去標識這條記錄,主鍵無疑是最好的標識,但是很多表也不一定需要主鍵,但是對於資料量大,查詢頻繁的資料庫表,一定要有主鍵,主鍵可以增加效率、防止重複等優點。

主鍵的選擇也比較重要,一般選擇總的長度小的鍵,小的鍵的比較速度快,同時小的鍵可以使主鍵的b

樹結構的層次更少。

主鍵的選擇還要注意組合主鍵的字段次序,對於組合主鍵來說,不同的字段次序的主鍵的效能差別可能會很大,一般應該選擇重複率低、單獨或者組合查詢可能性大的字段放在前面。

外來鍵:外來鍵作為資料庫物件,很多人認為麻煩而不用,實際上,外來鍵在大部分情況下是很有用的,理由是:外來鍵是最高效的一致性維護方法

資料庫的一致性要求,依次可以用外來鍵、check

約束、規則約束、觸發器、客戶端程式,一般認為,離資料越近的方法效率越高。

謹慎使用級聯刪除和級聯更新,級聯刪除和級聯更新作為sql server 2000

當年的新功能,在

2005

作了保留,應該有其可用之處。我這裡說的謹慎,是因為級聯刪除和級聯更新有些突破了傳統的關於外來鍵的定義,功能有點太過強大,使用前必須確定自己已經把握好其功能範圍,否則,級聯刪除和級聯更新可能讓你的資料莫名其妙的被修改或者丟失。從效能看級聯刪除和級聯更新是比其他方法更高效的方法。

優化⑤:儲存過程、檢視、函式的適當使用

很多人習慣將複雜操作都放在應用程式層,但如果你要優化資料訪問效能,將sql

**移植到資料庫上

(使用儲存過程,檢視,函式和觸發器

)也是乙個很大的改進原因如下:

1. 儲存過程減少了網路傳輸、處理及儲存的工作量,且經過編譯和優化,執行速度快,易於維護,且表的結構改變時,不影響客戶端的應用程式 

2、使用儲存過程,檢視,函式有助於減少應用程式中sql

複製的弊端,因為現在只在乙個地方集中處理

sql

3、使用資料庫物件實現所有的tsql

有助於分析

tsql

的效能問題,同時有助於你集中管理

tsql

**,更好的重構tsql**

優化⑥:傳說中的『三少原則』

①:資料庫的表越少越好

②:表的字段越少越好

③:欄位中的組合主鍵、組合索引越少越好

當然這裡的少是相對的,是減少資料冗餘的重要設計理念。

優化⑦:分割你的表,減小表尺寸

如果你發現某個表的記錄太多,例如超過一千萬條,則要對該錶進行水平分割。水平分割的做法是,以該錶主鍵的某個值為界線,將該錶的記錄水平分割為兩個表。

如果你若發現某個表的字段太多,例如超過八十個,則垂直分割該錶,將原來的乙個表分解為兩個表

優化⑧:字段設計原則

欄位是資料庫最基本的單位,其設計對效能的影響是很大的。需要注意如下:

a、資料型別盡量用數字型,數字型的比較比字元型的快很多。

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

c、 盡量不要允許

null

,除非必要,可以用

not null+default

代替。d、少用

text

和image

,二進位製字段的讀寫是比較慢的,而且,讀取的方法也不多,大部分情況下最好不用。

e、 自增字段要慎用,不利於資料遷移

--------------ak(老k):2012-12-28

資料庫效能優化二 資料庫表優化

資料庫優化包含以下三部分,資料庫自身的優化,資料庫表優化,程式操作優化.此文為第二部分優化 設計規範化表,消除資料冗餘 資料庫正規化是確保資料庫結構合理,滿足各種查詢需要 避免資料庫操作異常的資料庫設計方式。滿足正規化要求的表,稱為規範化表,正規化產生於20世紀 70年代初,一般表設計滿足前三正規化...

資料庫效能優化二 資料庫表優化

優化 設計規範化表,消除資料冗餘 資料庫正規化是確保資料庫結構合理,滿足各種查詢需要 避免資料庫操作異常的資料庫設計方式。滿足正規化要求的表,稱為規範化表,正規化產生於20世紀 70年代初,一般表設計滿足前三正規化就可以,在這裡簡單介紹一下前三正規化 第一正規化 1nf 無重複的列 所謂第一正規化 ...

資料庫效能優化二 資料庫表優化

優化 設計規範化表,消除資料冗餘 資料庫正規化是確保資料庫結構合理,滿足各種查詢需要 避免資料庫操作異常的資料庫設計方式。滿足正規化要求的表,稱為規範化表,正規化產生於20世紀70年代初,一般表設計滿足前三正規化就可以,在這裡簡單介紹一下前三正規化 第一正規化 1nf 無重複的列 所謂第一正規化 1...