根據多年經驗整理的《互連網MySQL開發規範》

來源:互聯網
上載者:User

標籤:

一、基礎規範

 

  • 使用 INNODB 儲存引擎
  • 表字元集使用 UTF8 
  • 所有表都需要添加註釋
  • 單表資料量建議控制在 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 儲存大小寫敏感的變長字串
  • 禁止在資料庫中儲存純文字密碼,把密碼加密後儲存
  • 用好數實值型別欄位
  • 儲存ip最好用 int 儲存而非 char(15) 
  • 不允許使用 ENUM 
  • 避免使用 NULL 欄位, NULL 欄位很難查詢最佳化,NULL欄位的索引需要額外空間,NULL欄位的複合索引無效
  • 少用 text/blob , varchar 的效能會比 text 高很多,實在避免不了blob,請拆表
  • 資料庫中不允許儲存大檔案,或者照片,可以將大對象放到磁碟上,資料庫中儲存它的路徑
 四、索引規範

 

1、索引的數量要控制:
  • 單張表中索引數量不超過5個
  • 單個索引中的欄位數不超過5個
  • 對字串使?用首碼索引,首碼索引長度不超過8個字元
  • 建議優先考慮首碼索引,必要時可添加偽列並建立索引
2、主鍵準則
  • 表必須有主鍵
  • 不使用更新頻繁的列作為主鍵
  • 盡量不選擇字串列作為主鍵
  • 不使用 UUID   MD5   HASH 這些作為主鍵(數值太離散了)
  • 預設使?非空的唯一鍵作為主鍵
  • 建議選擇自增或發號器
3、重要的SQL必須被索引,比如:
  •  UPDATE 、 DELETE 語句的 WHERE 條件列
  •  ORDER BY 、 GROUPBY 、 DISTINCT 的欄位
4、多表JOIN的欄位注意以下
  • 區分度最大的欄位放在前面
  • 核?SQL優先考慮覆蓋索引
  • 避免冗餘和重複索引
  • 索引要綜合評估資料密度和分布以及考慮查詢和更新比例
5、索引禁忌
  • 不在低基數列上建立索引,例如“性別”
  • 不在索引列進行數學運算和函數運算
6、盡量不使用外鍵
  • 外鍵用來保護參照完整性,可在業務端實現
  • 對父表和子表的操作會相互影響,降低可用性
7、索引命名:非唯一索引必須以idx 欄位1欄位2命名,唯一所以必須以 uniq  欄位 1 欄位 2 命名,索引名稱必須全部小寫8、建立的唯一索引必須不能和主鍵重複9、索引欄位的預設值不能為 NULL ,要改為其他的 default 或者空。 NULL 非常影響索引的查詢效率10、反覆查看與表相關的SQL,符合最左首碼的特點建立索引。多條欄位重複的語句,要修改語句條件欄位的順序,為其建立一條聯合索引,減少索引數量11、能使用唯一索引就要使用唯一索引,提高查詢效率12、研發要經常使用 explain ,如果發現索引選擇性差,必須讓他們學會使用hint 五、SQL規範

 

  • SQL語句儘可能簡單,大的SQL想辦法拆成小的SQL語句(充分利用QUERYCACHE和充分利用多核CPU)
  • 事務要簡單,整個事務的時間長度不要太長
  • 避免使用觸發器、函數、預存程序
  • 降低業務耦合度,為s acle out 、 sharding 留有餘地
  • 避免在資料庫中進?數學運算(MySQL不擅長數學運算和邏輯判斷)
  • 不要用 SELECT * ,查詢哪幾個欄位就SELECT這幾個欄位
  • SQL中使用到OR的改寫為用IN()(OR的效率沒有IN的效率高)
  • in裡面數位個數建議控制在 1000 以內
  • LIMIT分頁注意效率。LIMIT越大,效率越低。可以改寫 LIMIT ,比如例子改寫:

    SELECT id FROM t LIMIT 10000, 10; => SELECT id FROM t WHERE id > 10000 LIMIT 10;
  • 使用 UNION ALL 替代  UNION 

  • 避免使用大表的 JOIN 
  • 使用 GROUP BY 分組、自動排序
  • 對資料的更新要打散後批次更新,不要一次更新太多資料
  • 減少與資料庫的互動次數
  • 注意使用效能分析工具

    SQL explain / showprofile / mySQLsla

  • SQL語句要求所有研發,SQL關鍵字全部是大寫,每個詞只允許有一個空格

  • SQL語句不可以出現隱式轉換,比如 SELECT id FROM TABLE WHERE id=‘1‘ 
  • IN條件裡面的資料數量要少,我記得應該是500個以內,要學會使用EXIST代替IN,EXIST在一些情境查詢會比IN快
  • 能不用 NOT IN 就不用 NOTIN ,坑太多了。。會把空和NULL給查出來
  • 在SQL語句中,禁止使用首碼是%LIKE
  • 不使用負向查詢,如 NOT IN /  LIKE 
  • 關於分頁查詢:程式裡建議合理使用分頁來提高效率LIMITOFFSET較大要配合子查詢使用
  • 禁止在資料庫中跑大查詢
  • 使?先行編譯語句,只傳參數,比傳遞SQL語句更高效;一次解析,多次使用;降低SQL注入機率
  • 禁止使 ORDER BY RAND() 
  • 禁?單條SQL語句同時更新多個表
 六、流程規範

 

  • 所有的建表操作需要提前告知該表涉及的查詢SQL;
  • 所有的建表需要確定建立哪些索引後才可以建表上線;
  • 所有的改表結構、加索引操作都需要將涉及到所改表的查詢SQL發出來告知DBA等相關人員;
  • 在建新表加欄位之前,要求研發至少要提前3天郵件出來,給DBA們評估、最佳化和審核的時間
  • 大量匯入、匯出資料必須提前通知DBA協助觀察
  • 禁止線上上從庫執行後台管理和統計類查詢
  • 禁止有超級許可權的應用程式帳號存在
  • 推廣活動或上線新功能必須提前通知DBA進?行流量評估
  • 不在業務高峰期批次更新、查詢資料庫

原文 -- >  戳我 

轉自 -- >  戳我

根據多年經驗整理的《互連網MySQL開發規範》

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.