寫在前面:無規矩不成方圓。對於剛加入網際網路的朋友們,肯定會接觸到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,硬體裝置層 國內代表 小公尺,點心,阿里,以及錘子。裝置的作用毋庸置疑,如果不是手機等終端的快速進化,哪來今天火爆的移動網際網路熱潮,沒有裝置就無法上網,因此裝置是天生的入口並且是絕對的強大的入口,目前國際大牌在該層面上具有強大的引導力,比如三星,...