命名規(guī)范
- 所有數(shù)據(jù)庫對象名稱必須使用小寫字母并用下劃線分割。
- 所有數(shù)據(jù)庫對象名稱禁止使用數(shù)據(jù)庫的保留關(guān)鍵字。
MySQL關(guān)鍵字查詢:http://blog.csdn.net/yuxin6866/article/details/52210207。
若使用了關(guān)鍵字作為字段,查詢該字段是必須使用``包裹起來,否則報錯。 - 數(shù)據(jù)庫對象名稱要做到見名識義,并且長度不要過長。
- 臨時表必須以tmp為前綴以日期為后綴。
- 備份表必須以bak為前綴以日期為后綴。
- 所有存儲相同數(shù)據(jù)的列名和列類型必須一致。
基本設(shè)計規(guī)范
- 所有表必須使用Innodb引擎。
5.6版本以后的默認(rèn)引擎為Innodb,其支持事務(wù),行級鎖,更好的恢復(fù)性,高并發(fā)下性能更好。 - 數(shù)據(jù)庫和表的字符集統(tǒng)一用UTF8。
- 所有的表和字段都必須添加注釋。
- 盡量控制單表數(shù)據(jù)量的大小,簡易控制在500萬行內(nèi)。
可以用歷史數(shù)據(jù)歸檔,分庫分表等手段來控制數(shù)據(jù)量的大小。 - 盡量做到冷熱數(shù)據(jù)分離,減小表的寬度(減小表的列數(shù))。
減少磁盤IO,暴走熱數(shù)據(jù)的內(nèi)存緩存命中率。
避免讀入無用的冷數(shù)據(jù)。
經(jīng)常使用的列放到一個表中。 - 禁止在表中建立預(yù)留字段。
預(yù)留字段的命名很難做到見名識義。
預(yù)留字段無法取得存儲的數(shù)據(jù)類型。
對預(yù)留字段的修改會對表進(jìn)行鎖定,影響并發(fā)性。 - 禁止在數(shù)據(jù)庫中存儲圖片,文件等二進(jìn)制數(shù)據(jù)。
影響數(shù)據(jù)庫性能。 - 禁止在線上做數(shù)據(jù)庫壓力測試。
- 禁止從開發(fā)環(huán)境,測試環(huán)境中連接生成環(huán)境的數(shù)據(jù)庫。
索引設(shè)計規(guī)范
- 限制每張表上的索引的數(shù)量,建議單張表索引不超過5個。
索引并不是越多越好。 - 禁止給表中的每一列建立一個索引。
- 每個Innodb表必須有一個主鍵。
不使用更新頻繁的列作為主鍵,不使用多列主鍵。
不使用UUID,MD5,HASH,字符串作為主鍵。
主鍵建議使用MySQL的自增ID作為主鍵。 - 常見索引列建議:
select、update、delete語句的where從句中的列。
包含order by、group by、distinct中的字段。
多表join的關(guān)聯(lián)列。 - 索引列的順序:
區(qū)分度最高的列放在聯(lián)合索引的最左側(cè)。
盡量吧字段長度小的列放在聯(lián)合索引的最左側(cè)。
使用最頻繁的列放在聯(lián)合索引的最左側(cè)。 - 避免建立冗余和重復(fù)的索引。
- 對于頻繁的查詢優(yōu)先考慮使用覆蓋索引。
覆蓋索引:包含所有查詢字段的索引。
好處:避免Innodb表進(jìn)行索引的二次查找,可以把隨機(jī)IO變?yōu)轫樞騃O較快查詢效率。 - 盡量避免使用外鍵。
不建議使用外鍵約束,但一定要在表與表之間的關(guān)聯(lián)鍵上建立索引。