MYSQL數據庫設計規範與原則
- MYSQL數據庫設計規範
-
- 一、數據庫命名規範
- 採用26個英文字母(區分大小寫)和0-9的天然數(常常不須要)加上下劃線'_'組成;
- 命名簡潔明確(長度不能超過30個字符);
- 例如:user, stat, log, 也能夠wifi_user, wifi_stat, wifi_log給數據庫加個前綴;
- 除非是備份數據庫能夠加0-9的天然數:user_db_20151210;
-
- 二、數據庫表名命名規範
- 採用26個英文字母(區分大小寫)和0-9的天然數(常常不須要)加上下劃線'_'組成;
- 命名簡潔明確,多個單詞用下劃線'_'分隔;
- 例如:user_login, user_profile, user_detail, user_role, user_role_relation,
- user_role_right, user_role_right_relation
- 表前綴'user_'能夠有效的把相同關係的表顯示在一塊兒;
-
- 三、數據庫表字段名命名規範
- 採用26個英文字母(區分大小寫)和0-9的天然數(常常不須要)加上下劃線'_'組成;
- 命名簡潔明確,多個單詞用下劃線'_'分隔;
- 例如:user_login表字段 user_id, user_name, pass_word, eamil, tickit, status, mobile, add_time;
- 每一個表中必須有自增主鍵,add_time(默認系統時間)
- 表與表之間的相關聯字段名稱要求儘量的相同;
-
- 四、數據庫表字段類型規範
- 用盡可能少的存儲空間來存數一個字段的數據;
- 例如:能使用int就不要使用varchar、char,能用varchar(16)就不要使用varchar(256);
- IP地址最好使用int類型;
- 固定長度的類型最好使用char,例如:郵編;
- 能使用tinyint就不要使用smallint,int;
- 最好給每一個字段一個默認值,最好不能爲null;
-
- 五、數據庫表索引規範
- 命名簡潔明確,例如:user_login表user_name字段的索引應爲user_name_index惟一索引;
- 爲每一個表建立一個主鍵索引;
- 爲每一個表建立合理的索引;
- 創建複合索引請慎重;
-
- 六、簡單熟悉數據庫範式
- 第一範式(1NF):字段值具備原子性,不能再分(全部關係型數據庫系統都知足第一範式);
- 例如:姓名字段,其中姓和名是一個總體,若是區分姓和名那麼必須設立兩個獨立字段;
-
- 第二範式(2NF):一個表必須有主鍵,即每行數據都能被惟一的區分;
- 備註:必須先知足第一範式;
-
- 第三範式(3NF):一個表中不能包涵其餘相關表中非關鍵字段的信息,即數據表不能有沉餘字段;
- 備註:必須先知足第二範式;
-
- 備註:每每咱們在設計表中不能遵照第三範式,由於合理的沉餘字段將會給咱們減小join的查詢;
- 例如:相冊表中會添加圖片的點擊數字段,在相冊圖片表中也會添加圖片的點擊數字段;
-
-
-
- MYSQL數據庫設計原則
-
- 一、核心原則
- 不在數據庫作運算;
- cpu計算務必移至業務層;
- 控制列數量(字段少而精,字段數建議在20之內);
- 平衡範式與冗餘(效率優先;每每犧牲範式)
- 拒絕3B(拒絕大sql語句:big sql、拒絕大事物:big transaction、拒絕大批量:big batch);
-
- 二、字段類原則
- 用好數值類型(用合適的字段類型節約空間);
- 字符轉化爲數字(能轉化的最好轉化,一樣節約空間、提升查詢性能);
- 避免使用NULL字段(NULL字段很難查詢優化、NULL字段的索引須要額外空間、NULL字段的複合索引無效);
- 少用text類型(儘可能使用varchar代替text字段);
-
- 三、索引類原則
- 合理使用索引(改善查詢,減慢更新,索引必定不是越多越好);
- 字符字段必須建前綴索引;
- 不在索引作列運算;
- innodb主鍵推薦使用自增列(主鍵創建聚簇索引,主鍵不該該被修改,字符串不該該作主鍵)(理解Innodb的索引保存結構就知道了);
- 不用外鍵(由程序保證約束);
-
- 四、sql類原則
- sql語句儘量簡單(一條sql只能在一個cpu運算,大語句拆小語句,減小鎖時間,一條大sql能夠堵死整個庫);
- 簡單的事務;
- 避免使用trig/func(觸發器、函數不用客戶端程序取而代之);
- 不用select *(消耗cpu,io,內存,帶寬,這種程序不具備擴展性);
- OR改寫爲IN(or的效率是n級別);
- OR改寫爲UNION(mysql的索引合併很弱智);
- select id from t where phone = ’159′ or name = ‘john’;
- =>
- select id from t where phone=’159′
- union
- select id from t where name=’jonh’
- 避免負向%;
- 慎用count(*);
- limit高效分頁(limit越大,效率越低);
- 使用union all替代union(union有去重開銷);
- 少用鏈接join;
- 使用group by;
- 請使用同類型比較;
- 打散批量更新;
-
- 五、性能分析工具
- show profile;
- mysqlsla;
- mysqldumpslow;
- explain;
- show slow log;
- show processlist;
歡迎關注本站公眾號,獲取更多信息