1.數據命名規范
所有數據庫對象名稱必須使用小寫字母并用下劃線分割(mysql對大小寫敏感)
數據庫對象名稱禁止使用mysql關鍵字
數據庫對象命名要能做到見名識義,最好不要超過32個字符
臨時庫和表必須以tmp為前綴,并以日期為后綴
備份庫和表必須以bak為前綴并以日期為后綴
所有儲存相同數據的列名和列類型必須一致
2.數據庫基本設計規范
所有表必須使用Innodb存儲引擎
數據庫和表的字符集統一使用utf8,避免由于字符集轉換成的亂碼
所有的表和字段都要添加注釋
盡量控制單表數據量的大小,建議控制在500w以下(歷史數據歸檔,分庫分表)
謹慎使用mysql分區表(分區表在物理上表現為多個文件,在邏輯上表現為一個表)
盡量做到減少冷熱數據分離,減小表的寬度(減少磁盤IO,保證熱數據的內存緩存命中率)
禁止在表中建立預留字段
禁止在數據庫中存儲圖片,文件等二進制數據
禁止在線上做數據庫壓力測試
禁止從開發環境,測試環境直連生產環境數據庫
3.數據庫索引設計規范
限制每張表上的索引數量,建議單張表索引不超過5個
每個Innodb表必須有一個主鍵
不能使用更新頻繁的列為主鍵,不適用多列主鍵
不要使用UUID,MD5,HASH,字符串作為主鍵
主鍵建議使用自增加ID
盡量避免使用外鍵,數據完整性使用業務邏輯實現
4.數據庫字段設計規范
優先選擇符合存儲需要的最小的數據類型
盡量將字符串轉化為數字類型存儲
INET_ATON INET_OA
對于非負整型采用無符號整形進行存儲
一個由UTF8字符集存儲的漢字占3個字節
varchar(num)
避免使用text,blob數據類型
避免使用ENUM數據類型(修改ENUM值需要使用alter語句,orderby 效率低)
盡可能把所有列定義為NOT NULL(NULL 需要額外空間來保存,占用更多空間)
禁止使用字符串來保存時間
使用TIMESTAMP或DATETIME類型存儲時間
對于財務相關的金額類數據,必須使用decimal類型
5.數據庫SQL開發規范
建議使用預編譯語句進行數據庫操作(一次解析,多次使用)
避免數據類型的隱式轉換(會導致索引失效)
避免使用雙%號的查詢條件。如 alile '%123%'
充分利用表上已經存在的索引
一個sql只能利用到復合索引中的一列進行范圍查詢,意思把用到范圍搜索的列放到聯合索引的最右側
程序連接不同的數據庫使用不同的賬號,禁止跨庫查詢
禁止使用select * 進行查詢
禁止使用不含有字段列表的insert語句
避免使用子查詢,把子查詢優化為join操作(子查詢的結果集無法使用索引,會產生大量的臨時表)
避免使用join關聯太多的表,建議不超過5個
避免同數據庫的交互次數(數據庫更適合處理批量操作)
使用in代替or,范圍不要超過500。in相比or能更好的利用索引
禁止使用order by rand()進行隨機排序
where從句中禁止對列進行函數轉換和計算(會導致無法使用索引)
在明顯不會有重復值時,使用UNION ALL而不是使用UNION(UNIION會把娑有數據放到臨時表中,再進行去重操作 UNION ALL不會執行去重)
拆分復雜的大SQL為多個小SQL( 一個SQL會占用一個線程,拆分之后可以實現并行)
6.數據庫操作行為規范
超100萬行的批量寫操作,要分批多次進行操作(寫操作)。
對于大表使用pt-online-schema-change修改表結構
禁止為程序使用的賬號賦予super權限
對于程序連接數據庫賬號,遵循權限最小原則
程序使用數據庫賬號只能在一個DB下使用
程序使用數據庫賬號不能有drop權限