BDA 談網際網路 MySQL 開發規範

2021-08-29 12:13:37 字數 4059 閱讀 3392

寫在前面:無規矩不成方圓。對於剛加入網際網路的朋友們,肯定會接觸到mysql,mysql作為網際網路最流行的關係型資料庫產品,它有它擅長的地方,也有它不足的短板,針對它的特性,結合網際網路大多應用的特點,筆者根據自己多年網際網路公司的mysql dba經驗,現總結出網際網路mysql的一些開發規範,僅供參考。

(1) 使用innodb儲存引擎

(2) 表字符集使用utf8

(3) 所有表都需要新增注釋

(4) 單錶資料量建議控制在5000w以內

(5) 不在資料庫中儲存圖⽚、檔案等大資料

(7) 禁⽌從測試、開發環境直連資料庫

(1) 庫名錶名欄位名必須有固定的命名長度,12個字元以內

(2) 庫名、表名、欄位名禁⽌止超過32個字元。須見名之意

(3) 庫名、表名、欄位名禁⽌止使⽤用mysql保留字

(4) 臨時庫、表名必須以tmp為字首,並以⽇日期為字尾

(5) 備份庫、表必須以bak為字首,並以日期為字尾

(1) 禁⽌使用分割槽表

(2) 拆分大字段和訪問頻率低的字段,分離冷熱資料

(3) 用hash進⾏散表,表名字尾使⽤⼗進製數,下標從0開始

(4) 按日期時間分表需符合yyyy[mm][dd][hh]格式

(5) 採用合適的分庫分表策略。例如千庫十表、十庫百錶等 

(6) 盡可能不使用text、blob型別

(7) 用decimal代替float和double儲存精確浮點數

(8) 越簡單越好:將字元轉化為數字、使用tinyint來代替enum型別

(9) 所有欄位均定義為not null

(10) 使用unsigned儲存非負整數

(11) int型別固定占用4位元組儲存

(12) 使用timestamp儲存時間

(13) 使用int unsigned儲存ipv4

(14) 使用varbinary儲存大小寫敏感的變長字串

(15) 禁止在資料庫中儲存明文密碼,把密碼加密後儲存

(16) 用好數值型別字段

型別位元組

最小值最大值

(帶符號的/無符號的)

(帶符號的/無符號的)

tinyint

-128

無符號smallint

-32768

無符號mediumint

-8388608

無符號int

-2147483648

無符號bigint

-9223372036854775808

無符號如果數值字段沒有那麼大,就不要用 bigint

(17) 儲存ip最好用int儲存而非char(15)

(18) 不允許使用enum

(19) 避免使用null欄位

null欄位很難查詢優化,null欄位的索引需要額外空間,null欄位的復合索引無效

(20) 少用text/blob,varchar的效能會比text高很多,實在避免不了blob,請拆表

(21) 資料庫中不允許儲存大檔案,或者**,可以將大物件放到磁碟上,資料庫中儲存它的路徑

(1) 索引的數量要控制:

a、單張表中索參數量不超過5個

b、單個索引中的字段數不超過5個

c、對字串使⽤用字首索引,字首索引長度不超過8個字元

d、建議優先考慮字首索引,必要時可新增偽列並建立索引

(2) 主鍵準則

a、表必須有主鍵

b、不使用更新頻繁的列作為主鍵

c、盡量不選擇字串列作為主鍵

d、不使用uuid md5 hash這些作為主鍵(數值太離散了)

e、預設使⽤非空的唯一鍵作為主鍵

f、建議選擇自增或發號器

(3) 重要的sql必須被索引,比如:

a、update、delete語句的where條件列

b、order by、group by、distinct的字段

(4) 多表join的字段注意以下:

a、區分度最大的字段放在前面

b、核⼼sql優先考慮覆蓋索引

c、避免冗餘和重複索引

d、索引要綜合評估資料密度和分布以及考慮查詢和更新比例

(5) 索引禁忌

a、不在低基數列上建立索引,例如「性別」

b、不在索引列進行數**算和函式運算

(6) 盡量不使用外來鍵

a、外來鍵用來保護參照完整性,可在業務端實現

b、對父表和子表的操作會相互影響,降低可用性

(7) 索引命名

非唯一索引必須以 idx_欄位1_欄位2命名,唯一所以必須以uniq_欄位1_欄位2命名,索引名稱必須全部小寫

(8) 新建的唯一索引必須不能和主鍵重複

(9) 索引欄位的預設值不能為null

要改為其他的default或者空。null非常影響索引的查詢效率。

(10) 反覆檢視與表相關的sql,符合最左字首的特點建立索引。

多條字段重複的語句,要修改語句條件欄位的順序,為其建立一條聯合索引,減少索參數量

(11) 能使用唯一索引就要使用唯一索引,提高查詢效率

(12)研發要經常使用explain,如果發現索引選擇性差,必須讓他們學會使用hint

(1) sql語句盡可能簡單

大的sql想辦法拆成小的sql語句(充分利用query cache和充分利用多核cpu)

(2) 事務要簡單,整個事務的時間長度不要太長

(3) 避免使用觸發器、函式、儲存過程

(4) 降低業務耦合度,為sacle out、sharding留有餘地

(5) 避免在資料庫中進⾏數**算(mysql不擅長數**算和邏輯判斷)

(4) 不要用select *,查詢哪幾個欄位就select 這幾個字段

(5) sql中使用到or的改寫為用 in() (or的效率沒有in的效率高)

(6) in裡面數字的個數建議控制在1000以內

(7) limit分頁注意效率。limit越大,效率越低。可以改寫limit,比如例子改寫:

select id from tlimit 10000, 10; => select id from t where id > 10000 limit10;(9) 使用union all替代union

(10) 避免使⽤大表的join

(11) 使用group by 分組、自動排序

(12) 對資料的更新要打散後批量更新,不要一次更新太多資料

(13) 減少與資料庫的互動次數

(13) 注意使用效能分析工具:sql explain / showprofile / mysqlsla

(14) sql語句要求所有研發,sql關鍵字全部是大寫,每個詞只允許有乙個空格

(15) sql語句不可以出現隱式轉換,比如:select id from 表 where id='1'

(16) in條件裡面的資料數量要少,我記得應該是500個以內,要學會使用exist代替in,exist在一些場景查詢會比in快

(17) 能不用not in就不用notin,坑太多了。。會把空和null給查出來

(18) 在sql語句中,禁止使用字首是%的like

(19) 不使用負向查詢,如 not in/like

(19) 關於分頁查詢:程式裡建議合理使用分頁來提高效率limit,offset較大要配合子查詢使用

(20) 禁止在資料庫中跑大查詢

(21) 使⽤預編譯語句,只傳引數,比傳遞sql語句更高效;一次解析,多次使用;降低sql注入概率

(22) 禁止使⽤order by rand()

(23) 禁⽌單條sql語句同時更新多個表

(1) 所有的建表操作需要提前告知該錶涉及的查詢sql;

(2) 所有的建表需要確定建立哪些索引後才可以建表上線;

(3) 所有的改表結構、加索引操作都需要將涉及到所改表的查詢sql發出來告知dba等相關人員;

(4) 在建新錶加字段之前,要求研發至少要提前3天郵件出來,給dba們評估、優化和審核的時間

(5)批量匯入、匯出資料必須提前通知dba協助觀察

(7) 禁⽌有super許可權的應用程式賬號存在

(8) 推廣活動或上線新功能必須提前通知dba進⾏行流量評估

(9) 不在業務高峰期批量更新、查詢資料庫

mysql 網際網路 MySQL網際網路業務使用建議

一 基礎規範 表儲存引擎必須使用innodb 表字符集預設使用utf8,必要時候使用utf8mb4 解讀 1 通用,無亂碼風險,漢字3位元組,英文1位元組 2 utf8mb4是utf8的超集,有儲存4位元組例如表情符號時,使用它 禁止使用儲存過程,檢視,觸發器,event 解讀 1 對資料庫效能影響...

網際網路MySQL開發規範

一 基礎規範 1 使用innodb儲存引擎 2 表字符集使用utf8 3 所有表都需要新增注釋 4 單錶資料量建議控制在5000w以內 5 不在資料庫中儲存圖 檔案等大資料 7 禁 從測試 開發環境直連資料庫 二 命名規範 1 庫名錶名欄位名必須有固定的命名長度,12個字元以內 2 庫名 表名 欄位...

談移動網際網路入口

講得不錯,如圖所示這樣 下來我們逐層進行下分析 1,硬體裝置層 國內代表 小公尺,點心,阿里,以及錘子。裝置的作用毋庸置疑,如果不是手機等終端的快速進化,哪來今天火爆的移動網際網路熱潮,沒有裝置就無法上網,因此裝置是天生的入口並且是絕對的強大的入口,目前國際大牌在該層面上具有強大的引導力,比如三星,...