資料庫是程式的倉庫,也是程式中最脆弱的一部分,因為它的脆弱性和重要性,所以需要專門進行管理和優化。在如今的網路化的時代更加需要資料庫的靈活和快捷,乙個高效的資料庫能夠使程式執行效率更快,提高程式的執行效率。但往往對資料庫的設計達不到我們想要的效果,所以資料庫的優化顯得尤為重要。該系列文章正是考慮大資料量的當今如何才能讓資料庫的設計更加靈活,資料檢索、操作更加高效展開的討論,其中涉及到的優化方法是在筆者長期的開發經驗以及其它有關資料庫優化的文章基礎上進行總結的,如果有異議還請指出。
資料庫的優化分為很多種,因為sql物件較多,在對資料庫進行優化時需要考慮它們對效能的影響,而且優化的程度沒有最優,只有更優,這些優化方案還要根據使用環境的不同進行取捨,不一定都能保持高效率,你比如說開發的系統本身資料量不大,而且又是c/s系統這時候就可以不用考慮那麼多的優化問題,把重心可以放到程式的友好程度、穩定性、健壯性、靈活性上。首先從設計階段開始考慮資料庫的優化,大致的內容進行了整理彙總圖,如下。
設計階段的優化需要有相當多的經驗才可以,未雨綢繆才是最高境界,所以要預見性的避免很多問題,在設計時就讓資料庫查詢修改效率很高。
在建立資料庫的時候首先要盡量符合三正規化的要求,因為三正規化是乙個指導性的標準,在複雜的表關係中可以考慮使用正規化來達到表之間關係的平衡。在設計表結構時三正規化已經很充足了,另外可以考慮增加冗餘字段,有時候可以增加檢索的效率。
一正規化:每個字段表示的實體屬性唯一,最基礎的設計規範,一般的字段都會符合;
二正規化:消除部分依賴;
三正規化:消除傳遞依賴。
如果完完全全按照三正規化設計表結構的話,有時候會很繁瑣,對於簡單的實體轉換成表結構的時候可以不採用三正規化,因為正規化會產生較少的列和更多的表,這樣更不利於檢索修改,所以要根據實際情況而定。
合理的冗餘
在設計表結構時可以適當的考慮適當的冗餘,好的冗餘能大大提高表的檢索效率。在設計時常用的計算字段(如總計、最大值等)可以考慮儲存到資料庫實體中,這時可以考慮新增觸發器來保持資料的一致性(不建議這樣做,觸發器有很多不確定性);另外如果設計的表關係產生了許多表但是在檢索時需要合併關係,這時可以考慮在資料庫實體中新增重複列。
表分割
表的冗餘字段可以提高表的效率,同樣針對大資料量處理的時候需要考慮對錶進行垂直和水平的分割。
(1)垂直分割:把乙個實體表分割成兩個表。這樣把頻繁訪問的資料同較少被訪問的資料分割。在進行分割前要求每張表複製首要關鍵字。這樣產生的表有利於並行處理,將產生列數較少的表。
(2)水平分割:把乙個實體表分成多組(把所有的行分成多組)。這種方法適用於那些包含大量資料的實體表。在應用中常要保留歷史記錄,但是歷史記錄很少用到,這時額可以把頻繁被訪問的資料同較少訪問的歷史資料分割。或者也可以考慮資料備份清空的方式來保證資料的安全性。
在將生成物理模型時同樣需要考慮資料庫的優化,本著沒有最優只有更優的原則考慮資料庫的設計。下面針對資料庫中字段和索引優化來展開討論。
(1)盡量使用數字型別,數字型別查詢和操作效率比字串效率高
(2)字段型別在滿足增量需求情況下要選擇同種儲存型別中最小的,如:能使用smallint型別的字段,不要使用integer,這樣索引字段可以被更快地讀取,而且可以在1個資料頁上放置更多的資料行,因而也就減少了i/o操作。
(3)欄位不允許null值,可用not null+default代替
(4)使用text、image型別,或者盡量不用,因為二進位制的讀寫比較慢,而且讀取的方法單一
(5)慎用自增字段,不利於資料遷移(1)選用組合字段數最小的候選鍵,這樣在查詢的字段較少,提高查詢效率
(2)非要使用組合主鍵的話,將但字段查詢中重複率低的放在組合的前方使用索引時也注意一些誤區,不是索引越多越好,索引也不等同於主鍵。在使用時應注意以下原則:
(1)根據資料量決定哪些表需要增加索引,資料量小的可以只有主鍵;
(2)根據使用頻率決定哪些字段需要建立索引,選擇經常作為連線條件、篩選條件、聚合查詢、排序的字段作為索引的候選字段;
(3)把經常一起出現的字段組合在一起,組成組合索引,組合索引的字段順序與主鍵一樣,也需要把最常用的字段放在前面,把重複率低的字段放在前面;
(4)乙個表不要加太多索引,因為索引影響插入和更新的速度;
(5)盡可能避免更新聚集索引,因為聚集索引資料列的順序就是表記錄的物理儲存順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。
設計階段是資料庫開發程式中最重要的一步環節,做好了設計在後期開發的時候才能避免很多錯誤,這裡需要考慮的問題患還有很多,上面的是根據實踐經驗和翻閱的文章進行總結的,在設計大資料量的訪問時會發揮大的作用。
資料庫優化(持續更新中 )
1 合理使用索引 經常進行連線,但沒有指定為外來鍵的列上建立索引 在頻繁進行排序或分組 即進行group by或order by操作 的列上建立索引 在條件表示式中經常用到的不同值較多的列上建立檢索,在不同值少的列上不要建立索引 如性別只有兩種,不用索引 如果待排序的列有多個,可以在這些列上建立復合...
資料庫 持續更新中
explain plan forselect from test select from table dbms xplan.display select b.uniqueness,a.index name,a.table name,a.column name from all ind columns...
面試準備 資料庫(持續更新)
1 mysql分頁有什麼優化 2 悲觀鎖 樂觀鎖 悲觀鎖還是樂觀鎖,都是人們定義出來的概念,可以認為是一種思想。行鎖,表鎖,排他鎖,共享鎖等是資料庫的鎖機制 悲觀鎖 獲取鎖之後再執行操作,提交事務後釋放鎖,實現上使用資料庫提供的鎖機制適合資源競爭比較激烈,或者鎖代價小於回滾代價的場景 樂觀鎖 在事務...