MYSQL數據庫開發規範
命名規範
- 數據庫名、表名、字段名都使用小寫字母
- 單詞以前使用「_」來鏈接,不使用駝峯命名法
- 長度禁止超過48個字符
- 不準使用MySQL關鍵字
- 常規庫以db_開頭,常規表以tbl_開頭
- 臨時庫,臨時表以 tmp_ 爲前綴,以日期爲後綴
- 備份庫,備份表以 bak_ 爲前綴,以日期爲後綴
基礎規範
- 使用InnoDB存儲引擎
- 一概採用UTF-8編碼
- 表和屬性必須填註釋
- 單表數據量控制在1000W如下
- 禁止在生產庫作壓力測試
- 禁止從測試、開發環境直接生產庫
庫表設計
- 生產環境禁止使用分區表
- 拆分大字段及訪問頻率低的字段,分離冷熱數據
- Hash分表時,表後綴必須是10進制數
- 按日期分表時,年份使用2位而不使用4位
- 採用合適的Sharding策略,userId、date、province、
- 儘可能不使用外鍵,由程序來保證約束 有額外開銷、逐行操做、高併發時容易死鎖
- 單庫表數量不超過300張
- 單表字段數不超過50個
- 單行不超過200字節
字段規範
- 儘量不使用TEXT,CLOB,BLOB類型的字段: 對於大文本存儲,可使用varchar類型,varchar(65535) -> 64K 若是必定要使用,能夠單獨拆成一個表來使用
- 儘可能不在數據庫中保存圖片,文件等大字段
- 涉及金額的字段一概使用 Decimal類型,絕對不容許使用 double/float 類型
- 使用合適的數據類型: tinyint(1),smallint(2),mediumint(3),int(4),bigint(8),float(4),double(8),decimal(總長度,小數部分長度)
- 除非NULL有特殊含意,全部字段不準爲空: 很難進行查詢優化、NULL列加索引需額外空間、含NULL複合索引無效、應用開發容易出空指針異常
- 時間可使用datetime類型
- 不要使用枚舉類型
索引規範
- 單張表索引數量最好不超過5個
- 單個索引中字段數不超過5個
- 對字符串類型的字段使用前綴索引,前綴索引長度不超過8個字符
- 表必須有主鍵,主鍵不該該更新 禁止使用UUID,MD5,Hash結果做爲主鍵。 推薦使用獨立於業務的Auto_increment字列,或全局ID生成器做代理主鍵 數字型相比字符串型索引:高效、查詢快、佔空間小
- 重要的SQL必須被索引 where條件中的字段、order by、group by、distinct 字段、多表join的字段
- 區分度大的字符放在前面
- 核心SQL優先考慮覆蓋索引
- 避免冗餘和重複索引
- 不在低區分度字段建索引,如:性別,車型,車款
- 不要在索引字段進行數學運算和函數運算,索引會失效
- 查詢時,不使用%前導的查詢,如: like '%cd'
- 儘可能不使用負向查詢,如:not in / not like / <> / != 緣由:全表掃描
SQL設計
- 使用預編譯語句和參數形式,不手動拼接SQL字符串,1)提升性能 2)防止SQL注入
- 充份利用索引,尤爲前綴索引
- 避免使用存儲過程、觸發器、UDF、Events等 緣由:1)下降業務複雜度,全部業務處理都不放在數據庫進行,只讓數據庫作最擅長的事情;2)存儲過程出Bug很差調試
- 避免大表Join
- 避免在數據庫中進行數學運算 緣由:1)數據庫不擅長作數學運算和邏輯判斷;2)可能會使索引失效
- 減小與數據庫的交互次數 INSERT ... ON DUPLICATE KEY UPDATE REPLACE INTO、INSERT IGNORE 、INSERT INTO VALUES(),(),() UPDATE … WHERE ID IN(10,20,50,…)
- 合理使用分頁 限制分頁展現的頁數,如:頁面上只顯示有100頁數據 只能點擊上一頁、下一頁,不能隨意跳轉頁號 採用延遲關聯:不直接關聯兩張大表,而是先查一張表,再用主鍵從另外一張表中查數據
- 拒絕大SQL,將大SQL拆分紅小SQL 簡單SQL的緩存命中率高;1條SQL只能使用一個核,把大SQL拆成多個小SQL能夠充份利用多核CPU;減小鎖表時間
- 拒絕大事務,事務使用原則: 即開即用,用完即關 與事務無關的操做放在事務外面 不破壞一致性的前提下,使用多個短事務替代長事務
- 拒絕大批量
- 使用
in
來代替 or
,in
中的值不準超過200個 對於使用or的SQL,若是or的條件不是同一個字段,可使用 union 來優化
- 禁止使用 order by rand(),除非數據量很是少
- 在上線前,使用 explain 來分析SQL的執行計劃
- 使用 union all ,不使用 union
- 儘可能不使用 select * 來執行查詢,緣由: 消耗網絡帶寬
- 實時統計計數使用緩存,雙向更新凌晨跑基準;非實時在數據倉庫統計
- 高效分頁:使用查詢條件減小數據集 select * from table where id>=12345 limit 10;
- 使用同數據類型在where條件中進行列值比較 數字對數字、字符對字符 數值列與字符串比較:同時轉爲雙精度 字符串列與數字比較:字符串列轉數值,而且不會使用索引
- group by 默認會排序,若是不須要對分組結果排序,可使用 order by null,這樣就不會對結果排序了。
select phone, count(*) from post group by phone order by null
行爲規範
- 批量導⼊、導出數據必須提早通知DBA協助觀察
- 禁⽌在線上從庫執⾏後臺管理和統計類查詢
- 禁⽌有super權限的應⽤程序帳號存在
- 產品出現⾮數據庫致使的故障時及時通知DBA協助排查
- 推⼲活動或上線新功能必須提早通知DBA進⾏流量評估
- 數據庫數據丟失,及時聯繫DBA進⾏恢復
- 對單表的屢次alter操做必須合併爲⼀次操做
- 不在MySQL數據庫中存放業務邏輯
- 重⼤項目的數據庫⽅案選型和設計必須提早通知DBA參與
- 對特別重要的庫表,提早與DBA溝通肯定維護和備份優先
- 不在業務⾼峯期批量更新、查詢數據庫
- 提交線上建表改表需求,必須詳細註明全部相關SQL語句
歡迎關注本站公眾號,獲取更多信息