數據庫開發規範

數據庫命名規範

全部數據庫對象名稱必須使用小寫字母並用下劃線分割(庫名錶名區分大小寫)

全部數據對象名稱禁止使用MySQL保留關鍵字(``括起來   SELECT `from` FROM user)

數據庫對象的命名要見名識義,而且最好不要超過32個字符

臨時表必須以tmp爲前綴並以日期爲後綴,備份表必須以bak爲前綴並以日期爲後綴

全部存儲相同數據的列名和列類型必須一致(關聯時隱式數據類型轉換)

數據庫基本設計規範

全部表必須使用Innodb(5.6之後默認引擎)存儲引擎(除非特殊需求[列存儲,空間數據(5.7之前)])

數據庫和表的字符集統一使用UTF8(統一字符集能夠避免因爲字符集轉換產生的亂碼)

全部表和字段都須要添加註釋(使用comment從句,從一開始就進行數據字典維護)

儘可能控制單表數據量的大小,建議控制在500萬之內(500萬並非數據庫的限制,這個限制取決於存儲設置和文件系統.能夠用歷史數據歸檔,分庫分表等手段控制數據量大小)

謹慎使用MySQL分區表(分區表在物理上表現爲多個文件,在邏輯上表現爲一個表。謹慎選擇分區鍵,跨分區查詢效率可能更低,建議採用物理分表的方式管理大數據)

儘可能作到冷熱數據分離,減少表的寬度(MySQL限制最多存儲1024*4列,每一行大小不能超過65535字節。減小磁盤IO,保證熱數據的內存緩存命中率,更有效的利用緩存,避免讀入無用的冷數據)

禁止在表中創建預留字段(對預留字段類型的修改,會對錶進行鎖定)

禁止在數據中存儲圖片,文件等二進制數據

禁止在線上作數據庫壓力測試

禁止從開發環境,測試環境直接連生產環境數據庫

數據庫索引設計規範

限制每張表的索引數量,建議單張表索引不超過5個(禁止給表中的每一列都創建單獨的索引) Innodb是按照主鍵索引的順序來組織表的,每一個Innodb表必須有一個主鍵,若是沒有明確主鍵會優先選擇第一個非空惟一索引做爲主鍵,沒有非空惟一索引,(隱式定義)會自動生成一個佔6個字節的主鍵(性能很差)

不使用更新頻繁的列做爲主鍵,不使用多列主鍵(聯合索引)

不使用UUID,MD5,HASH,字符串做爲主鍵,建議使用自增id

常見索引列 : select、updata、delete語句的where從句中的列,包含在order by、group by、distinct中的字段,多表join的關聯列

索引列的選擇 : 區分度(惟一值的數量)最高的列放在聯合索引的最左側,儘可能把字段長度小的列放在聯合索引的最左側,使用最頻繁的列放在聯合索引最左側

避免創建冗餘索引和重複索引

對於頻繁的查詢優先考慮使用覆蓋索引(就是包含了全部查詢字段的索引:避免Innodb表進行索引的二次查找,能夠把隨機IO變爲順序IO加快查詢效率)

儘可能避免使用外鍵[可用於保證數據的參照完整性,但建議在業務端實現,外鍵會影響父表和子表的寫操做從而下降性能](不建議使用外鍵約束,但必定在表與表之間的關聯鍵上創建索引)

數據庫字段設計規範

優先選擇符合存儲須要的最小的數據類型(將字符串轉換爲數字類型,對於非負型數據,優先考慮使用無符號整型存儲)

varchar(N)中的N表明的是字符數,而不是字節數( UTF8字符集varchar(255)能存儲255漢字,佔用765個字節 )

避免使用TEXT,BLOB數據類型(建議把BLOB或是TEXT列分離到單獨的擴展表中,TEXT或BLOB類型只能使用前綴索引)

避免使用ENUM數據類型(修改ENUM值須要使用ALTER語句,ENUM類型的order by操做效率低,須要額外操做,禁止使用數值做爲ENUM的枚舉值)

儘量把全部列定義爲NOT NULL(索引NULL列須要額外的空間來保存,因此要佔用更多的空間。進行比較和計算時要對NULL值作特殊處理)

字符串存儲日期類型數據(1.沒法用日期函數進行計算和比較。2.用字符串存儲日期要佔用更多的空間)

使用TIMESTAMP(4字節)或DATETIME(8字節)類型存儲時間(TIMESTAMP佔用4字節和INT相同,可是可讀性高,範圍 1970-01-01 00:00::01 ~ 2038-01-19 03:14:07)

財務相關的金額類數據,必須使用decimal類型(decimal類型爲精準浮點數,在計算時不會丟失精度,佔用空間由定義的寬度決定[每4個字節存儲9個數字,小數點佔一個字節],可用於存儲比bigint更大的整數數據)

相關文章
相關標籤/搜索