1、 資料庫開發規範
阿新 • • 發佈:2019-02-11
第1章 資料庫開發規範的制定
資料庫設計步驟:
1、資料結構設計:邏輯設計-》物理設計
2、實際工作中:邏輯設計+物理設計
3、物理設計:表名+欄位名+欄位型別
資料庫設計幾個規範:
資料庫命名規範、資料庫基本設計規範、資料庫索引設計規範、資料庫欄位設計規範、資料庫SQL開發規範、資料庫操作行為規範
資料庫命名規範
1、所有資料庫物件名稱必須使用小寫字母並用下劃線分割
不同的資料庫名 DbName dbname
不同的表名 Table table tabLe
2、所有資料庫物件名稱禁止使用MySQL保留關鍵字
select id,username,from
3、資料庫物件的命名要見名識義,並且最好不要超過32個字元
例如 使用者資料庫mc_userdb 使用者賬號表 user_account
4、臨時庫表必須以tmp為字首並以日期為字尾
5、備份庫、備份表必須以bak為字首並以日期為字首
6、所有儲存相同資料的列名和列型別必須一致
比如兩張表中有相同的資料,那麼他們列名和列型別必須是一致的
資料庫基本設計規範
1、所有表必須使用Innodb儲存引擎,mysql 5.6後預設儲存引擎,支援事務,行級鎖,更好的恢復性,高併發下效能更好
2、資料庫和表的字符集統一使用UTF8,避免由於字符集轉換產生的亂碼
mysql中utf8字符集漢字佔3個位元組,ASCII碼佔用1個位元組
3、所有表和欄位都需要添加註釋,使用comment從句新增表和列的備註
4、儘量控制單表資料量的大小,建議控制在500萬
mysql最多可以儲存多少萬資料?目前沒有做限制,這種限制取決於儲存設定和檔案系統
可以用歷史資料歸檔,分庫分表等手段來控制資料量大小
5、謹慎使用mysql分割槽表
分割槽表在物理上表現為多個檔案沒在邏輯上表現為一個表
謹慎選擇分割槽鍵,跨分割槽查詢效率可能更低
建議採用物理分表的方式管理大資料
6、儘量做到冷熱資料分離,減小表的寬度
mysql限制最多儲存4096列,為了是減少磁碟IO,保證熱資料的記憶體快取命中率,利用更有效的利用快取,避免讀入無用的冷資料
經常使用的列放在一個表中
7、禁止在表中建立預留欄位
預留欄位的命名很難做到見名識義
預留欄位無法確認儲存的資料型別,所以無法選擇合適的型別
對預留欄位型別的修改,會對錶進行鎖定,修改欄位型別的成本往往大於增加
8、禁止在資料庫中儲存圖片、檔案等二進位制資料
9、禁止在線上做資料庫壓力測試
10、禁止從開發環境
索引設計規範
索引對資料庫的查詢效能來說非常重要,查詢、更新,禁止濫用索引
1、限制每張表上的索引數量,建議單張表索引不超過5個
索引並不是越多越好的,索引可以提高效率同樣可以降低效率
索引可以增加查詢效率,但同樣也會降低插入和更新的效率
2、禁止給表中的每一列都建立單獨的索引
3、Innodb是按照主鍵索引的順序來組織表的
4、每個Innodb表必須有一個主鍵
不使用更新頻繁的列作為主鍵,不使用多列主鍵
不使用uuid、MD5、hash,字串列作為主鍵
主鍵建議使用主鍵自增
常見的索引列建議:
select、update、delete語句的where從句中的列
包含在order by、group by 、destinct中的欄位
多表join的關聯列
如何選擇索引列的順序:
聯合索引是從做到右的順序來實現的
1、區分度最高的列放在聯合索引的最左側
2、儘量把欄位長度小的列放在聯合索引的最左側
3、使用最頻繁的列放到聯合索引的左側
5、避免建立冗餘索引和重複索引
重複索引:如 primary key(id)、index(id)、unique index(id)
冗餘索引:如 index(a,b,c) index(a,b) index(a)
6、對於頻繁的查詢優先使用覆蓋索引
覆蓋索引:就是包括了所有查詢欄位的索引
優點:避免Innodb表進行索引的二次查詢,可以把隨機IO變為順序IO加快查詢效率
7、儘量避免使用外來鍵
不建議使用外來鍵約束,但一定在表與表之間的關聯鍵上建立索引
外來鍵可用於保證資料的參照完整性,但建議在業務端實現
外來鍵會影響父表和子表的寫操作從而降低效能
資料庫欄位設計規範
1、優先選擇符合儲存需要的最小的資料型別
將字串轉化為數字型別儲存
對於非負資料採用無符號整形進行儲存
signed int -2147483648-2147483648
unsigned int 0-2147483648
有符號比無符號多出一倍的儲存空間
varchar(n) n代表字元數,不是位元組數,varchar(255)=765個位元組
過大的長度會消耗更多的記憶體
2、避免使用text\BLOB資料型別
建議text\BLOB列分離到單獨的擴充套件表中
text\BLOB型別只能使用字首索引
3、避免使用enum資料型別
修改enum需要使用alter語句
enum型別的order by操作效率低,需要額外操作
禁止使用數值作為enum的列舉值
4、儘可能把所有列定義為not null
索引null列需要額外的空間來儲存,所以要佔用更多的空間
進行比較和計算時要對null值做特別的處理
5、禁止字串儲存日期型的資料
缺點1:無法用日期函式進行計算和比較
缺點2:用字串儲存日期要佔用更多的空間
使用timestamp或datetime型別儲存時間,timestamp儲存空間更小
4、財務的相關金額使用decimal型別
decimal型別為精準浮點數,在計算時不會丟失精度
float、double非精準浮點數
資料庫SQL開發規範
1、建議使用預編譯語句進行資料庫操作
好處:只傳引數,比傳遞SQL語句更高效
相同語句可以一次解析,多次使用,提高處理效率
2、避免資料型別的隱式轉換
隱式轉換會導致索引失效
3、利用表上已經存在的索引
4、禁止連線不同的資料庫使用不同的賬號,禁止垮庫查詢
為資料庫遷移和分庫分表留出餘地
減低業務耦合度
避免許可權過大而產生的安全風險
5、禁止使用select * 必須用select 欄位列表 查詢
消耗更多的CPU和io以及網路頻寬資源
無法使用覆蓋索引
可減少表結構變更帶來的影響
6、禁止使用不含欄位列表的insert語句
如,insert into t values(‘a’,’b’,’c’)
7、避免使用子查詢,可以把子查詢優化為join操作
子查詢的結果集無法使用索引
子查詢會產生臨時表,如果子查詢資料量大則嚴重影響效率
消耗過多的CPU和io資源
8、避免使用join關聯太多的表
每join一個表會多佔用一部分記憶體join_buffer_size
會產生臨時表操作,影響查詢效率
mysql最多關聯61個表,建議不超過5個
9、減少同資料庫的互動次數
10、禁止使用order by rand()進行隨機排序
11、where從句中禁止對列進行函式轉換和計算
對列進行函式轉換和計算會導致無法使用索引
如: where date(createtime)=’20160901’
優化後:where createtime>=’20160901’
資料庫操作行為規範