天天看點

學習筆記2:資料庫結構優化

資料庫結構優化的目的

    【減少資料備援】

    【避免資料庫維護中出現更新,插入,删除異常】

    【節約資料的存儲空間】

    【提高查詢效率】

資料庫設計步驟

    【需求分析】:    全面了解産品設計的存儲需求

                    存儲需求

                    資料處理需求

                    資料安全性和完整性

    【邏輯設計】:    設計資料的邏輯存儲結構

                    資料實體之間的邏輯關系,解決資料備援和資料維護異常

    【實體設計】:根據所使用的資料庫特點進行表結構設計

            關系型資料庫  :oralce,mysql,sqlserver

            非關系型資料庫:mongo,redis

            存儲引擎:

    【維護優化】:根據實際情況對索引,存儲結構進行優化

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------

資料庫設計範式

    【第一範式】:

                1.資料庫中的所有字段都隻具有單一屬性

                2.單一屬性的列是由基本的資料類型所構成的

                3.設計的表都是簡單的二維表

    【第二範式】:一個表中隻具有一個業務主鍵,也就是說符合第二範式的表中不能存在非主鍵列 隻對部分主鍵的依賴

    【第三範式】:每一個非主屬性既不部分依賴,也不傳遞依賴于業務主鍵,也就是在第二範式基礎上消除了非主屬性對主鍵的傳遞依賴

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------    

資料庫反範式化設計:使用存儲空間換區更小的時間

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------

實體設計:

    【定義資料庫,表,字段命名規範】

    【選擇合适的存儲引擎】

            myisam:非事務,支援并發插入的表級鎖

    【為表中的字段選擇合适的資料類型】

            當一個列可以選擇多種資料類型時,應該優先考慮數字類型,其次是日期或是二進制類型,最後是字元型。

            對于相同級别的資料類型,應優先選擇占用空間小的資料類型

            【正确選擇整數類型】

                    類型            存儲空間            取值範圍

                    tinyint                1位元組            255

                    samllint            2位元組            65535

                    mediumint            3位元組            16777215

                    int                    4位元組            4293967295

                    bigint                8位元組            18446744073709551615

            【正确選擇實數類型】

                    (非精确)float                    4位元組

                    (非精确)double                8位元組

                      (精确)decimal                每4位元組存9個數字,小數點占一個位元組

            【varchar和char】

                    varchar:    1.字元串最大長度比平均長度大很多

                                2.字元串很少被更新

                                3.使用了多位元組字元集存儲字元串(中文,utf8)

                                varchar用于存儲變長字元串的,隻占用必要的存儲空間。字元為機關,1字元=3位元組。

                                列的最大長度小于255則隻占用1個額外位元組記錄字元串長度

                                列的最大長度大于255則要占用2個額外位元組記錄字元串長度

                                【如何确定varchar寬度】:

                                                        使用最小的符合需求的長度

                                                        varchar(5)和varchar(255)存儲mysql字元串性能不同(會消耗記憶體)

                    char:        1.長度近似

                                2.短字元串

                                3.經常更新的字元串列

                                類型是定長的(char(50),哪怕隻存了1個字元,也在記憶體中消耗50)

                                字元串存儲char類型的列中會删除末尾空格

                                最大寬度255

            【存儲日期資料】:    不要使用字元串存儲日期

                                日期類型比字元串空間小

                                日期類型在查找過濾時可以用日期進行對比

                                日期類型有豐富的處理函數

                                需求時間範圍滿足的情況下,使用timestamp格式存儲時間戳

                    datetime:    同市區無關,占用8個位元組的存儲空間

                                YYYY-mm-dd HH:II:ss

                    timestamp:    依賴所指定的時區。時間戳,占用4個位元組

                    date:        保留日期部分(3個位元組)    YYYY-mm-dd

                    time:        保留時間部分()HH:MM:SS

    【為innodb選擇主鍵】    

            1.主鍵盡可能小

            2.主鍵應該是順序增長