【資料庫最佳化(持續更新)】--第一彈設計最佳化

來源:互聯網
上載者:User

前言

       資料庫是程式的倉庫,也是程式中最脆弱的一部分,因為它的脆弱性和重要性,所以需要專門進行管理和最佳化。在如今的網路化的時代更加需要資料庫的靈活和快捷,一個高效的資料庫能夠使程式運行效率更快,提高程式的運行效率。但往往對資料庫的設計達不到我們想要的效果,所以資料庫的最佳化顯得尤為重要。該系列文章正是考慮大資料量的當今如何才能讓資料庫的設計更加靈活,資料檢索、操作更加高效展開的討論,其中涉及到的最佳化方法是在筆者長期的開發經驗以及其它有關資料庫最佳化的文章基礎上進行總結的,如果有異議還請指出。

       資料庫的最佳化分為很多種,因為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)儘可能避免更新叢集索引,因為叢集索引資料列的順序就是表記錄的實體儲存體順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。


結語
   設計階段是資料庫開發程式中最重要的一步環節,做好了設計在後期開發的時候才能避免很多錯誤,這裡需要考慮的問題患還有很多,上面的是根據實踐經驗和翻閱的文章進行總結的,在設計大資料量的訪問時會發揮大的作用。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.