MYSQL數據庫開發規範

命名規範

  1. 數據庫名、表名、字段名都使用小寫字母
  2. 單詞以前使用「_」來鏈接,不使用駝峯命名法
  3. 長度禁止超過48個字符
  4. 不準使用MySQL關鍵字
  5. 常規庫以db_開頭,常規表以tbl_開頭
  6. 臨時庫,臨時表以 tmp_ 爲前綴,以日期爲後綴
  7. 備份庫,備份表以 bak_ 爲前綴,以日期爲後綴

基礎規範

  1. 使用InnoDB存儲引擎
  2. 一概採用UTF-8編碼
  3. 表和屬性必須填註釋
  4. 單表數據量控制在1000W如下
  5. 禁止在生產庫作壓力測試
  6. 禁止從測試、開發環境直接生產庫

庫表設計

  1. 生產環境禁止使用分區表
  2. 拆分大字段及訪問頻率低的字段,分離冷熱數據
  3. Hash分表時,表後綴必須是10進制數
  4. 按日期分表時,年份使用2位而不使用4位
  5. 採用合適的Sharding策略,userId、date、province、
  6. 儘可能不使用外鍵,由程序來保證約束 有額外開銷、逐行操做、高併發時容易死鎖
  7. 單庫表數量不超過300張
  8. 單表字段數不超過50個
  9. 單行不超過200字節

字段規範

  1. 儘量不使用TEXT,CLOB,BLOB類型的字段: 對於大文本存儲,可使用varchar類型,varchar(65535) -> 64K 若是必定要使用,能夠單獨拆成一個表來使用
  2. 儘可能不在數據庫中保存圖片,文件等大字段
  3. 涉及金額的字段一概使用 Decimal類型,絕對不容許使用 double/float 類型
  4. 使用合適的數據類型: tinyint(1),smallint(2),mediumint(3),int(4),bigint(8),float(4),double(8),decimal(總長度,小數部分長度)
  5. 除非NULL有特殊含意,全部字段不準爲空: 很難進行查詢優化、NULL列加索引需額外空間、含NULL複合索引無效、應用開發容易出空指針異常
  6. 時間可使用datetime類型
  7. 不要使用枚舉類型

索引規範

  1. 單張表索引數量最好不超過5個
  2. 單個索引中字段數不超過5個
  3. 對字符串類型的字段使用前綴索引,前綴索引長度不超過8個字符
  4. 表必須有主鍵,主鍵不該該更新 禁止使用UUID,MD5,Hash結果做爲主鍵。 推薦使用獨立於業務的Auto_increment字列,或全局ID生成器做代理主鍵 數字型相比字符串型索引:高效、查詢快、佔空間小
  5. 重要的SQL必須被索引 where條件中的字段、order by、group by、distinct 字段、多表join的字段
  6. 區分度大的字符放在前面
  7. 核心SQL優先考慮覆蓋索引
  8. 避免冗餘和重複索引
  9. 不在低區分度字段建索引,如:性別,車型,車款
  10. 不要在索引字段進行數學運算和函數運算,索引會失效
  11. 查詢時,不使用%前導的查詢,如: like '%cd'
  12. 儘可能不使用負向查詢,如:not in / not like / <> / != 緣由:全表掃描

SQL設計

  1. 使用預編譯語句和參數形式,不手動拼接SQL字符串,1)提升性能 2)防止SQL注入
  2. 充份利用索引,尤爲前綴索引
  3. 避免使用存儲過程、觸發器、UDF、Events等 緣由:1)下降業務複雜度,全部業務處理都不放在數據庫進行,只讓數據庫作最擅長的事情;2)存儲過程出Bug很差調試
  4. 避免大表Join
  5. 避免在數據庫中進行數學運算 緣由:1)數據庫不擅長作數學運算和邏輯判斷;2)可能會使索引失效
  6. 減小與數據庫的交互次數 INSERT ... ON DUPLICATE KEY UPDATE REPLACE INTO、INSERT IGNORE 、INSERT INTO VALUES(),(),() UPDATE … WHERE ID IN(10,20,50,…)
  7. 合理使用分頁 限制分頁展現的頁數,如:頁面上只顯示有100頁數據 只能點擊上一頁、下一頁,不能隨意跳轉頁號 採用延遲關聯:不直接關聯兩張大表,而是先查一張表,再用主鍵從另外一張表中查數據
  8. 拒絕大SQL,將大SQL拆分紅小SQL 簡單SQL的緩存命中率高;1條SQL只能使用一個核,把大SQL拆成多個小SQL能夠充份利用多核CPU;減小鎖表時間
  9. 拒絕大事務,事務使用原則: 即開即用,用完即關 與事務無關的操做放在事務外面 不破壞一致性的前提下,使用多個短事務替代長事務
  10. 拒絕大批量
  11. 使用in來代替 orin中的值不準超過200個 對於使用or的SQL,若是or的條件不是同一個字段,可使用 union 來優化
  12. 禁止使用 order by rand(),除非數據量很是少
  13. 在上線前,使用 explain 來分析SQL的執行計劃
  14. 使用 union all ,不使用 union
  15. 儘可能不使用 select * 來執行查詢,緣由: 消耗網絡帶寬
  16. 實時統計計數使用緩存,雙向更新凌晨跑基準;非實時在數據倉庫統計
  17. 高效分頁:使用查詢條件減小數據集 select * from table where id>=12345 limit 10;
  18. 使用同數據類型在where條件中進行列值比較 數字對數字、字符對字符 數值列與字符串比較:同時轉爲雙精度 字符串列與數字比較:字符串列轉數值,而且不會使用索引
  19. group by 默認會排序,若是不須要對分組結果排序,可使用 order by null,這樣就不會對結果排序了。 select phone, count(*) from post group by phone order by null

行爲規範

  1. 批量導⼊、導出數據必須提早通知DBA協助觀察
  2. 禁⽌在線上從庫執⾏後臺管理和統計類查詢
  3. 禁⽌有super權限的應⽤程序帳號存在
  4. 產品出現⾮數據庫致使的故障時及時通知DBA協助排查
  5. 推⼲活動或上線新功能必須提早通知DBA進⾏流量評估
  6. 數據庫數據丟失,及時聯繫DBA進⾏恢復
  7. 對單表的屢次alter操做必須合併爲⼀次操做
  8. 不在MySQL數據庫中存放業務邏輯
  9. 重⼤項目的數據庫⽅案選型和設計必須提早通知DBA參與
  10. 對特別重要的庫表,提早與DBA溝通肯定維護和備份優先
  11. 不在業務⾼峯期批量更新、查詢數據庫
  12. 提交線上建表改表需求,必須詳細註明全部相關SQL語句
相關文章
相關標籤/搜索