前言
數據庫是程序的倉庫,也是程序中最脆弱的一部分,因爲它的脆弱性和重要性,所以需要專門進行管理和優化。在如今的網絡化的時代更加需要數據庫的靈活和快捷,一個高效的數據庫能夠使程序運行效率更快,提高程序的運行效率。但往往對數據庫的設計達不到我們想要的效果,所以數據庫的優化顯得尤爲重要。該系列文章正是考慮大數據量的當今如何才能讓數據庫的設計更加靈活,數據檢索、操作更加高效展開的討論,其中涉及到的優化方法是在筆者長期的開發經驗以及其它有關數據庫優化的文章基礎上進行總結的,如果有異議還請指出。
數據庫的優化分爲很多種,因爲SQL對象較多,在對數據庫進行優化時需要考慮它們對性能的影響,而且優化的程度沒有最優,只有更優,這些優化方案還要根據使用環境的不同進行取捨,不一定都能保持高效率,你比如說開發的系統本身數據量不大,而且又是C/S系統這時候就可以不用考慮那麼多的優化問題,把重心可以放到程序的友好程度、穩定性、健壯性、靈活性上。首先從設計階段開始考慮數據庫的優化,大致的內容進行了整理彙總圖,如下。
設計階段的優化需要有相當多的經驗纔可以,未雨綢繆纔是最高境界,所以要預見性的避免很多問題,在設計時就讓數據庫查詢修改效率很高。
一、規範化
1、數據庫的規範化
在創建數據庫的時候首先要儘量符合三範式的要求,因爲三範式是一個指導性的標準,在複雜的表關係中可以考慮使用範式來達到表之間關係的平衡。在設計表結構時三範式已經很充足了,另外可以考慮增加冗餘字段,有時候可以增加檢索的效率。
一範式:每個字段表示的實體屬性唯一,最基礎的設計規範,一般的字段都會符合;
二範式:消除部分依賴;
三範式:消除傳遞依賴。
如果完完全全按照三範式設計表結構的話,有時候會很繁瑣,對於簡單的實體轉換成表結構的時候可以不採用三範式,因爲範式會產生較少的列和更多的表,這樣更不利於檢索修改,所以要根據實際情況而定。
2、非規範化
合理的冗餘
在設計表結構時可以適當的考慮適當的冗餘,好的冗餘能大大提高表的檢索效率。在設計時常用的計算字段(如總計、最大值等)可以考慮存儲到數據庫實體中,這時可以考慮添加觸發器來保持數據的一致性(不建議這樣做,觸發器有很多不確定性);另外如果設計的表關係產生了許多表但是在檢索時需要合併關係,這時可以考慮在數據庫實體中添加重複列。
表分割
表的冗餘字段可以提高表的效率,同樣針對大數據量處理的時候需要考慮對錶進行垂直和水平的分割。
(1)垂直分割:把一個實體表分割成兩個表。這樣把頻繁訪問的數據同較少被訪問的數據分割。在進行分割前要求每張表複製首要關鍵字。這樣產生的表有利於並行處理,將產生列數較少的表。
(2)水平分割:把一個實體表分成多組(把所有的行分成多組)。這種方法適用於那些包含大量數據的實體表。在應用中常要保留歷史記錄,但是歷史記錄很少用到,這時額可以把頻繁被訪問的數據同較少訪問的歷史數據分割。或者也可以考慮數據備份清空的方式來保證數據的安全性。
二、生成物理
在將生成物理模型時同樣需要考慮數據庫的優化,本着沒有最優只有更優的原則考慮數據庫的設計。下面針對數據庫中字段和索引優化來展開討論。
1、 字段
(1)儘量使用數字類型,數字類型查詢和操作效率比字符串效率高(2)字段類型在滿足增量需求情況下要選擇同種存儲類型中最小的,如:能使用smallint類型的字段,不要使用integer,這樣索引字段可以被更快地讀取,而且可以在1個數據頁上放置更多的數據行,因而也就減少了I/O操作。
(3)字段不允許null值,可用Not Null+Default代替
(4)使用text、image類型,或者儘量不用,因爲二進制的讀寫比較慢,而且讀取的方法單一
(5)慎用自增字段,不利於數據遷移
2、主鍵
(1)選用組合字段數最小的候選鍵,這樣在查詢的字段較少,提高查詢效率(2)非要使用組合主鍵的話,將但字段查詢中重複率低的放在組合的前方
3、索引
使用索引時也注意一些誤區,不是索引越多越好,索引也不等同於主鍵。在使用時應注意以下原則:(1)根據數據量決定哪些表需要增加索引,數據量小的可以只有主鍵;
(2)根據使用頻率決定哪些字段需要建立索引,選擇經常作爲連接條件、篩選條件、聚合查詢、排序的字段作爲索引的候選字段;
(3)把經常一起出現的字段組合在一起,組成組合索引,組合索引的字段順序與主鍵一樣,也需要把最常用的字段放在前面,把重複率低的字段放在前面;
(4)一個表不要加太多索引,因爲索引影響插入和更新的速度;
(5)儘可能避免更新聚集索引,因爲聚集索引數據列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。