基礎規範
- 使用innodb儲存引擎
- 表字符集使用utf-8
- 所有表新增註釋
- 單表資料量建議控制在5000W以內
- 不再資料庫中儲存圖、檔案等大資料
- 禁止線上上做資料庫壓力測試
- 禁止測試、開發環境直連資料庫
命名規範
- 庫名錶名欄位名必須有固定的命名長度,12個字元以內
- 庫名、表名、欄位名禁止超過32個字元。須見名之意
- 庫名、表名、欄位名禁止使用MySQL保留字
- 臨時庫、表名必須以tmp為字首,並以日期為字尾
- 備份庫、表必須以bak為字首,並以日期為字尾
庫、表、欄位開發設計規範
禁止使用分割槽表
拆分大欄位和翻身顧問頻率低的欄位,分離冷熱資料
用HASH進散表,表名字尾使進位制數,下標從0開始
按日期時間分表需符合
YYYY[MM][DD][HH]
格式採用合適的分庫分表策略。例如千庫十表、十庫百表等
儘可能不適用text、blob型別
用decimal代替float和double儲存精確浮點數
越簡單越好:將字元轉換為數字、使用tinyint來代替enum型別
所有欄位均為not null
使用unsigned儲存非負數
int型別固定佔有4位元組儲存
使用timestamp儲存時間
使用int unsigned儲存ipv4
使用varbinary儲存大小寫敏感的變長字串
禁止在資料庫中儲存明文密碼,把密碼加密後儲存
用好數值型別欄位
型別 位元組 最小值 最大值 tinyint 1 -128 127 smallint 2 -32768 32767 mediumint 3 -8388608 8388607 int 4 -2147483648 2147483647 bigint 8 -9223372036854775808 9223372036854775807 如果數值欄位沒有那麼大,就不要用bigint
儲存ip最好用int儲存而非char(15)
不允許使用enum
避免使用null欄位
null欄位很難查詢一花,null欄位的索引需要額外空間,null欄位的複合索引無效。
索引規範
- 單個表中的索引數量不超過5個
- 單個索引中的欄位數不超過5個
- 對字串使用字首索引,字首索引長度不超過8個字元
- 建議優先考慮字首索引,必要可新增偽列並建立索引
- 表必須有主鍵
- 不使用更新頻繁的列作為主鍵
- 儘量不選擇字串列作為主鍵
- 不使用uuid md5 hash這些作為主鍵-太離散
- 預設使非空的唯一鍵作為主鍵
- 建議選擇自增或發號器
- 重要的SQL必須必須被索引,比如update、delete語句的where條件列、order by、group by、distinct的欄位
- 多表join的欄位注意
1.區分度最大的欄位放在前面
2.核SQL優先考慮覆蓋索引
3.避免冗餘和重複索引
4.索引要綜合評估資料密度和分佈以及考慮查詢和更新比例
- 索引禁忌
1.不在低基數列上建立索引、例如性別
2.不在索引列記性數學運算和函式運算
- 儘量不使用外來鍵
1.外來鍵用來保護參照完整性,可以業務端實現
2.對父表和字表的操作會互相影響,降低可用性
- 索引命名
1.非唯一索引必須以 inx_欄位1_欄位2
2.唯一索引必須以 uniq_欄位1_欄位2
- 索引欄位的預設值不能為空。null非常影響索引的查詢效率。
- 反覆檢視和表相關的SQL,符合最左字首的特點建立索引。多條欄位重複的索引,要修改語句條件欄位的順序,為其建立一條聯合索引,減少索引數量。
- 能使用唯一索引就使用唯一索引
- 研發要經常使用explain,如果發現索引選擇性差,必須讓他們學會使用hint。
SQL規範
- SQL語句儘可能簡單
- 事物要簡單,整個事物的時間產生過度不要太長
- 避免使用觸發器、函式、儲存過程
- 降低業務耦合度,為sacle out,sharding留有餘地
- 避免在資料庫中進行數學運算,mysql不擅長數學運算和邏輯判斷
- 不要用selecy *,查詢那幾個欄位就select那幾個欄位
- sql中使用or的改寫成in,or的效率沒有in的效率高
- in裡面數字的個數建議1000以內
- limit分頁注意效率。limit越大,效率越低。
- 使用union all替代union
- 避免使大表join
- 使用group bu分組、自動排序
- 對資料的更新要打散後批量更新,不要一次更新太多資料
- 減少和資料庫的互動次數
- 注意使用效能分析工具
- SQL語句要求所有研發,SQL關鍵字全部大寫,每個詞只允許一個空格
- SQL語句不可以出現隱式轉換
- 能不用not in就不用
- 禁止使用字首是%的like
- 不使用負向查詢,如 not in、not like
- 禁止在資料庫總跑大查詢
- 使預編譯語句,只傳引數,比傳遞SQL語句更高效。降低SQL隱碼攻擊。
- 禁止使order by rand
- 禁止單條SQL語句同時更新多個表
流程規範
- 所有的建表操作需要提前告知該表涉及的查詢SQL
- 所有的建表需要確定建立那些索引後才可以建表上線
- 所有的改表結構、加索引操作都需要涉及到所該表的查詢SQL發出來通知DBA等相關人員
- 在新建表加欄位之前,要求研發至少提前3天郵件出來,給dba門評估、優化和稽核
- 批量匯入、匯出資料必須提前通知DBA協助觀察
- 禁止線上從庫執行後端管理和統計類查詢
- 禁止super許可權的應用程式賬戶存在
- 不再業務高峰期批量更新、查詢資料庫
相關連結
mp.weixin.qq.com/s/D5_cbdvzGFYCBsM...
本作品採用《CC 協議》,轉載必須註明作者和本文連結