MySQL開發規範

MaChao發表於2020-11-16

基礎規範

  • 使用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 協議》,轉載必須註明作者和本文連結

相關文章