MySql數據庫開發規範

根據以前寫的文章內容,結合網上找到的資料,整理出下面的MySql數據庫規範做爲參考。數據庫

數據庫命名規範

  1. 全部的數據庫對象名稱(包括庫名、表名、列名等等)必須以小寫字母命名,每一個單詞之間用下劃線分割
  2. 全部的數據庫對象名稱禁止使用MySQL保留關鍵字
  3. 數據庫對象的命名要能作到見名知意,而且不要超過32個字符
  4. 數據庫中用到的臨時表以tmp爲前綴並以日期爲後綴
  5. 數據庫中用到的備份表以bak爲前綴並以日期爲後綴
  6. 在不一樣的庫或表中,要保證全部存儲相同數據的列名和列類型必須一致

數據庫基本設計規範

  1. 全部表若是沒有特殊需求,都要使用Innodb存儲引擎。Innodb存儲引擎支持事務、行級鎖、更好的恢復性、高併發下性能更好。
  2. 數據庫和表的字符集統一使用UTF8字符集,避免因爲字符集的轉換產生亂碼。
  3. 全部的表和字段都須要添加註釋。使用comment從句添加表和列的備註,從一開始就把數據字典維護好
  4. 控制單表數據量的大小,建議控制在500萬行之內。
    能夠採用歷史數據歸檔(常見於日誌表)和分庫分表的方式控制單表數據的大小。
  5. 謹慎使用MySQL分區表,避免跨分區查詢,不然效率很低。
    分區表在邏輯上表現爲一個表,可是在物理上將數據存儲在多個文件。最好能將分區表的不一樣分區文件存儲在不一樣的磁盤陣列上。
  6. 表中的列不要太多,儘可能作到冷熱數據分離,減少表的寬度。
    減小表的寬度,可讓一頁內存中容納更多的行,進而減小磁盤IO,更有效的利用緩存。
  7. 常常一塊兒使用的列儘可能放到一個表中,避免過多的關聯操做。
  8. 禁止在表中創建預留字段。
    修改列的類型會所鎖表。修改一個字段類型的成本要高於增長一個字段。
  9. 禁止在數據庫中存儲圖片、文件等

數據庫字段設計規範

  1. 優先爲表中的每一列選擇符合存儲須要的最小的數據類型
    列的字段類型越大,創建索引佔據的空間就越大,致使一個頁中的索引越少,形成IO次數增長,影響性能。
  2. 每一個字段儘量具備NOT NULL屬性
  3. 避免使用Blob、Text及ENUM類型
  4. 使用datetime、timestamp存儲時間類型,禁止使用字符串替代
  5. 使用數字類型存儲IP地址,用INET_ATON、INET_NTOA能夠在IP地址和數字類型間轉換。
  6. VARCHAR類型的長度應該儘量短。
    VARCHAR類型雖然在硬盤上是動態長度的,可是在內存中佔用的空間是固定的最大長度。

數據庫索引設計規範

  1. 限制每張表上的索引數量,建議單張表索引不超過5個
    索引並非越多越好。索引能夠提升查詢的效率,但會下降寫數據的效率。有時很差的索引還會下降查詢的效率。
  2. 禁止給表中的每一列都創建單獨的索引。設計良好的聯合索引比每一列上的單獨索引效率要高出不少。
  3. 每一個Innodb表都必須有一個主鍵,且不使用更新頻繁的列做爲主鍵,不使用多列主鍵。不使用UUID、MD五、字符串列做爲主鍵。最好選擇值的順序是連續增加的列做爲主鍵,因此建議選擇使用自增ID列做爲主鍵
  4. 建議在下面的列上創建索引:
    在SELECT,UPDATE,DELETE語句的WHERE從句上的列。在ORDER BY,GROUP BY,DISTINCT上的列。多表JOIN的關聯列。
  5. 區分度最高的列放在聯合索引的最左側。使用頻繁的列放在聯合索引的最左側。
  6. 避免冗餘的索引,如:primary key(id),index(id),unique index(id)
  7. 避免重複的索引,如:index(a,b,c),index(a,b),index(a)
    重複的和冗餘的索引會下降查詢效率,由於MySQL查詢優化器會不知道該使用哪一個索引。
  8. 不要依靠外鍵保證參照完整性,在業務端實現參照完整性的要求。創建外鍵約束後的表在插入數據時要進行數據參照完整性檢查,這會致使消耗數據庫性能。雖然不使用MySql自帶的外鍵,但必定在表與表之間的關聯鍵上創建索引。

數據庫SQL開發規範

  1. 在程序中,建議使用預編譯語句進行數據庫操做。預編譯只編譯一次,屢次使用,比SQL效率高。
  2. 避免數據類型的隱式轉換。隱式轉換會致使索引失效。
  3. 避免使用雙%號或前置%號的查詢條件,這樣沒法利用到索引。
  4. 禁止在查詢中使用select *
  5. 避免使用子查詢,子查詢會產生臨時表,臨時表沒有任何索引,數據量大時嚴重影響效率。建議把子查詢轉化成關聯查詢。
  6. 避免使用JOIN關聯太多的表。
  7. 儘可能減小同數據庫的交互次數,數據庫更適合處理批量操做。
  8. 使用IN代替OR
  9. 禁止在where從句中對列進行函數轉換和計算,會致使索引無效。
  10. 在不須要去重的狀況下,要使用UNION ALL代替UNION。
相關文章
相關標籤/搜索