咱們在項目一開始的設計中,就要忙着考慮數據庫的設計,表、字段、索引、sql等等,而在項目比較大型的時候,團隊開發中因爲多人同時進行,那麼儘早的進行設計規範是項目開發很是關鍵的一步,那麼關於數據庫設計規範有哪些呢,包括如下6項: html
1.數據庫命名規範
2.數據庫基本設計規範
3.數據庫索引設計規範
4.數據庫字段設計規範
5.SQL開發規範
6.數據庫操做行爲規範
接下來逐一詳細介紹一下各個規範:sql
1.數據庫命名規範:數據庫
1)全部數據庫對象名稱必須使用小寫字母並用下劃線分割(MySQL對大小寫是敏感的)緩存
2)禁止使用MySQL的保留關鍵字(好比:select user,from,age from tb_user 這時候識別不出from關鍵字,除非使用`from`,反向單引號來區別)服務器
3)數據庫對象的命名最後可以見名識義,而且最好不要超過32個字符 ,例如:用戶數據庫 bd_userdb (百度_用戶數據庫) ,用戶帳號表 user_account網絡
4)臨時庫表必須以tmp前綴並以日期爲後綴,tmp_user_20180505 提供更加明確的表名併發
備份庫,備份表必須以bak前綴並以日期爲後綴,bak_userdb_20180504 bak_user_20180505數據庫設計
5)全部存儲相同數據的列名和類型必須一致,例如:不一樣庫表中的user_id(int unsigned not null),那麼名稱和類型必須是一致的,不然會產生查詢效率下降等各類問題函數
2.數據庫基本設計規範:高併發
1)全部表必須使用InnoDB存儲引擎。在MySQL5.6之後,innodb已經成爲了默認存儲引擎,它支持事務、行級鎖,更好的恢復性,高併發下性能更好
2)數據庫和表的字符集統一使用UTF-8。爲了不亂碼、性能等問題
3)全部的表和字段都須要添加註釋。使用comment添加備註信息,從一開始就進行數據庫字典的維護
4)儘可能控制單表數據量的大小,建議控制在500萬行之內。使用歷史數據歸檔、分庫分表操做手段來控制數據量的大小
5)謹慎使用MySQL中的分區表。跨分區查詢效率比較低,建議採用物理分表的方式來管理大數據
6)儘可能作到冷數據分離,減少表寬度。字段太多的狀況,儘可能分表,將經常使用的放在一塊,不經常使用的字段分到其餘表中,有效減小磁盤的IO,保證熱數據的緩存命中率
7)禁止在表中創建預留字段。因爲沒法預知預留字段的類型,後期對改字段進行修改會耗費不少資源,對錶進行鎖定等問題
8)禁止存儲圖片、文件等二進制文件,形成MySQL的性能影響。這些應該存儲到專門的圖片、文件服務器中,數據庫中只存儲對應的信息標識。
禁止在線上作數據庫壓力測試
禁止從開發環境、測試環境直連生成環境數據庫
3.索引設計規範:
1)限制每張表索引的數量,建議單表索引不超過5個 。索引並非越多越好,能提升查詢效率,也能下降效率。應該根據實際狀況來創建索引。
2)每一個InnoDB表中必須有一個主鍵(惟一非空列)。不用使用頻繁更新的列爲主鍵,不使用MD5,UUID,HASH,字符串列做爲主鍵。主鍵建議選擇使用自增ID值
3)常見索引列建議:where從句中的列 order by、group by、distinct 中的字段,多表join的關聯列,若是在字句中是單個列,那就單獨索引,有多個列,那能夠創建聯合索引
4)如何選擇索引列的順序,區分度最高(好比主鍵列)的列,字段長度小,使用頻繁的列放在聯合索引的最左側
5)避免創建冗餘和重複的索引:index(a,b,c),index(a,b),index(a) 對於a就是重複索引
6)對於頻繁的查詢優先考慮使用覆蓋索引:包含了全部查詢字段的索引
7)儘可能避免使用外鍵約束。外鍵會影響父表與子表的寫操做從而下降性能
4.數據庫字段設計規範:
1)優先選擇符合存儲須要的最小數據類型。例如:將字符串轉化爲數字存儲
對於非負數優先選用無符號型來存儲。例如:主鍵id,無符號比有符號多出一倍的存儲空間。
有符號:signed int -2147483648 ~ 2147483647
無符號:unsigned int 0 ~ 4294967295
varchar(N) N表明的是字符數,而不是字節數,使用UTF8存儲漢字varchar(255)=765個字節
過大的長度會消耗更多的內存,根據字段長度來分配內存。
2)避免使用Text、Blob數據類型,若須要使用,儘可能分配到專門的擴展表中
3)避免使用Enum枚舉類型。order by操做效率低。禁止使用數值做爲ENum枚舉值
4)儘量把全部列定義爲NOT NULL。索引NULL列須要更多的存儲空間來保存。索引會失效。
5)避免使用字符串來存儲日期時間,使用TIMESTAMP或DATATIME來存儲時間
6)與財務相關的金額類型數據,必須使用Decimal類型。保證數據精度,計算時不丟失精度。
5.數據庫SQL開發規範:
1)建議使用預編譯語句進行數據庫操做。只傳參數,比傳遞sql更加高效,相同語句一次解析以後,屢次使用,節約sql解析的成本,提升處理效率。
2)避免數據類型的隱式轉換。隱式轉換致使索引失效,通常在where字句條件中出現的類型轉換,致使了索引失效。
3)合理利用已存在索引,而不是盲目添加索引。
避免使用雙%的查詢條件:like '%123%',只要出現前綴%,索引失效。
一個SQL只能利用到複合索引的一列進行範圍查詢,若聯合索引 index(a,b,c) 對a進行範圍查詢,那麼b和c將失效,應當將a放到最右側
使用left join 或 not exists 來優化 not in 操做,not in會使索引失效
4)程序鏈接不一樣數據庫時應該使用不一樣的帳號,禁止跨庫查詢
5)禁止使用 select * 必須使用 select <字段列表> 查詢,消耗過多的IO和cpu以及網絡帶寬資源
6)禁止使用不含字段的insert 語句,爲了減小表結構的變動帶來的影響:insert into table values('a','b','c'); 應當指明要插入的列,insert into table(c1,c2,c3) values('a','b','c');
7)避免使用子查詢,能夠將子查詢優化爲join操做:子查詢都會建立臨時表,佔用cpu和io資源,子查詢結果集沒法使用索引。
8)避免使用join關聯太多的表:
每關聯一張表,多佔用一部份內存(join_buffer_size)
會產生臨時表操做,影響查詢效率
MySQL最多容許關聯61張表,建議不超過5張表
9)減小同數據庫的交互次數
10)使用in代替or。in的值不超過500個,in能夠有效使用索引,or不行。
11)禁止使用order by rand() 進行隨機排序,這個操做對性能有很大影響,儘可能經過程序來獲得隨機值再從數據庫中獲取數據。
12)禁止在where從句中對列進行函數轉換和計算,形成索引的失效。where data(createtime) = '2018-01-01' ,儘可能在程序中進行計算
13)在明顯不會出現重複值的時候使用union all 而不是union。union會先加載全部數據到臨時表中而後去重,而union all不會去重。
14)拆分複雜的大SQL成多個小SQL。並行執行小SQL來提升處理效率
6.數據庫操做行爲規範:
1)超過100萬行的批量寫操做,要分批屢次進行操做:
大批量操做可能形成嚴重的主從延遲問題
binlog日誌爲row格式時,胡產生大量的日誌,形成資源不足
避免產生大事務的操做
2)對於大表使用pt-online-schema-change工具來修改表結構。過程是:先建立新表,而後複製舊錶數據到新表,將新表名稱改爲舊錶名稱,最後刪除舊錶
3)禁止爲程序使用的帳號賦予super超管權限
4)對於程序鏈接數據庫帳號,遵循權限最小的原則。程序使用數據庫支行和只能在一個DB下使用,不許跨庫,程序使用的帳號原則上不許有drop權限
以上就是MySQL的一些設計規範,固然不是說必定要遵循以上的原則,具體視實際應用場景而定,經過DBA指導來指定原則。
本文原創,轉載請標註出處:http://www.cnblogs.com/Luke-Me/p/8994432.html