常見數據庫設計規範

數據庫命名規範

1、所有數據庫對象名稱必須使用小寫字母 + 下劃線分割;(因爲MySQL是大寫敏感);

2、所有數據庫對象名稱禁止使用MySQL的保留關鍵字,如:SELECT、FROM等;

3、數據庫對象命名做到見名知意,長度最好不要超過32個字符;如:user_account;

4、臨時表必須以tmp_爲前綴,並以日期爲後綴;備份庫、備份表必須以bak_爲前綴並以日期爲後綴;這樣方便查看和刪除操作;

5、所有存儲相同數據的列名和列類型必須一致;避免在表聯查時索引失效;

數據庫基本設計規範

1、所有表必須使用Innodb存儲引擎,MySQL5.5之前是Myisam(默認存儲引擎)情況,5.6之後默認是Innodb;Innodb是支持事務、行級鎖。(二者區別?)

2、數據庫和表的字符集統一使用UTF-8;字符集統一,避免字符轉換亂碼;UTF-8中漢字佔用3個字節,ASCII碼佔1個字節;

3、所有表和字段都需要添加註釋,comment定義;一開始進行數據字典的維護;

4、儘量控制控制單表數據量的大小,建議在500萬以內(分庫分表實現);方便修改表結構、備份、恢復時有問題;單個文件表大小限制是2GB(32位系統);

5、謹慎使用MySQL分區表,分區表是在物理上表現爲多個文件,在邏輯上表現爲一個表(充分利用IO,快);謹慎選擇分區表,跨分區查詢效率可能更低;

6、儘量做到冷熱數據分離,減少表的寬度(限制最多存儲4096列),減少磁盤IO,保證熱數據的內存緩存命中率;利用更有效的利用緩存,避免讀入無效的冷數據;不要使用Select *;垂直拆分,經常一起使用的列放到一個表中;

7、禁止在表中建立預留字段,無法確定其數據類型、字段名等,修改字段類型會鎖表,按需增加字段更好;

8、禁止在數據庫中存儲圖片,文件等二進制數據,影響性能;

9、禁止在線上做數據庫壓力測試;在測試環境壓力測試來評估生產環境;

10、禁止從開發環境,測試環境自連生產環境數據庫;各環境分開;

數據庫索引設計規範(索引---雙刃劍)

1、限制每張表上的索引數量,建議每張表索引不超過5個,不要濫用索引;

2、每個Innodb表必須有一個主鍵;主鍵順序和數據存儲順序是一致的;建議不要用更新頻繁的列作爲主鍵,不使用UUID,MD5,HASH,字符串作爲主鍵;建議選擇自增id作爲主鍵;

3、常見索引列的建議:select、update、delete語句的where從句中的列;包含在order by、group by、distinct的字段;多表JOIN的關聯列;

4、選擇索引列的順序:索引是從左到右的順序來使用的,區分度最高(唯一率)的列放在聯合索引的最左側;儘量把字段長度小的列放在聯合索引的最左側;使用最頻繁的列放到聯合索引的左側;

5、避免建立冗餘索引(?)和重複索引(?);

6、對於頻繁的查詢優先考慮使用覆蓋索引(就是包含了所有查詢字段的索引);好處:避免Innodb表進行索引的二次查找;可以把隨機IO變爲順序IO加快查詢率;

7、儘量避免使用外鍵約束,在表與表之間的關聯鍵上建立索引;邏輯外鍵替代物理外鍵;

數據庫字段設計規範

1、優先選擇存儲需要的最小的數據類型;將字符串轉化爲數字類型存儲;如IP地址轉化:INET_ATON('192.163.2.12')=43262344,INET_NTOA(43262344)='192.163.2.12';

對於非負型的數據來說,要優先使用無符號整型來存儲;如:SIGNED INT 範圍:-2147483648~2147483647,UNSIGNED INT 範圍:0~4294967295;

VARCHAR(N)中N指的是字符數,不是字節數;

使用UTF8存儲漢字Varchar(255)=765個字節,(即:1個漢字=3個字節)

過大的長度會消耗更多的內存; 

避免使用TEXT、BLOG數據類型;建議把這些類型的列分離到單獨的擴展表中;且只能使用前綴索引;

避免使用ENUM數據類型,

2、儘量把所有列定義爲NOT NULL;索引NULL列需要額外的空間來存儲,所以要佔用更多的空間;

3、不建議使用字符串存儲日期類型的數據,無法使用日期函數和比較,字符串會佔用更多的空間;建議使用TIMESTAMP或DATETIME類型存儲日期;

TIMESTAMP範圍:1970-01-01 00:00:01~2038-01-19 03:14:07,佔用4個字節,超出範圍使用DATETIME;

4、財務xiang相關的金額類數據,必須使用decimal類型;大小由其寬度確定,可存儲比BigInt更大的整型數據,非精準類型:float、double;

數據庫SQL開發規範

1、建議使用預編譯語句(PREPARE)進行數據庫操作,可以重複使用執行計劃(一次編譯,多次運行),減少sql編譯的時間,還可以避免sql注入;

2、避免數據類型的隱式轉換,可能導致索引失效;

3、充分利用表存在的索引:

避免使用雙%、左%的查詢條件,如a like ‘%123%’;

一個sql只能利用到複合索引中的一列進行範圍查找;

使用left join或者not exists來優化not in操作;

4、程序鏈接不同的數據庫使用不同的賬號,禁止跨庫查詢,目的:爲數據庫遷移和分庫分表留出餘地,降低業務耦合度,避免權限過大而產生的安全風險;

5、禁止使用select * ,必須使用select <字段列表>查詢;因爲消耗更多的CPU、IO、網絡帶寬資源,無法使用覆蓋索引;可減少表結構變更帶來的影響;

6、禁止使用不含字段列表的INSERT語句,減少表結構變更帶來的影響;

7、避免使用子查詢,可以把子查詢優化爲join操作;因爲子查詢的結果集無法使用索引,子查詢會產生臨時表操作,太大時會影響效率,消耗的CPU和IO資源;

8、避免使用join關聯太多的表,最多61個表,建議不超過5個;

9、減少同數據庫的交互次數,合併和批量操作可以提高效率,;

10、使用in代替or,in的指不要超過500個,in操作可以利用索引,

11、禁止使用order by rand()進行隨機排序,會把表中所有符合條件的數據裝載到內存中進行排序;推薦在程序中獲取一個隨機值,然後從數據庫中獲取數據的方式;

12、where從句中禁止對列進行函數轉換和計算,會導致索引失效;

13、在明顯不會有重複值時使用UNION ALL而不是UNION,UNION會把所有數據放到臨時表中後再進行去重操作,UNION ALL不會對結果集進行去重操作;

14、拆分複雜的大SQL爲多個小SQL;

數據庫操作行爲規範

1、超100萬行的批量寫操作,要分批多次進行操作;可能導致嚴重的主從延遲,會產生大量的日誌;避免產生大事務操作;

2、對於大表使用pt-online-schema-change修改表結構,避免延遲;

3、禁止爲程序使用的賬號賦予super權限;

4、對於程序鏈接數據庫賬號,遵循權限最小原則;一般不能有drop權限;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章