寫在前面:無規矩不成方圓。對於剛加入互聯網的朋友們,肯定會接觸到MySQL,MySQL作為互聯網最受歡迎的關係型資料庫產品,它有它擅長的地方,也有它不足的短板,針對它的特性,結合互聯網大多應用的特點,筆者根據自己多年互聯網公司的 MySQL DBA經驗,現總結出互聯網MySQL的一些開發規範,僅供參考。
一、基本規範(1)
使用INNODB存儲引擎(2)
表字符集使用UTF8(3)
所有表格都需要加入註解(4)
單表資料量建議控制在 5000W以內(5)
不在資料庫中儲存圖⽚、檔案等大數據(6)
(6) 禁止在線上做數據庫壓力測試 (7)
禁 ⽌從測試、開發環境直連資料庫
二、命名規範
(1)
庫名表名字段名必須有固定的命名長度, 12個字符以內(2) 庫名、表名、欄位名禁⽌
止超過32止超過32止超過32止>個字元。須見名之意(3) 庫名、表名、欄位名禁庫名、表名、欄位名禁
⽌止使⽤⽤用MySQL
保留字(4) (4) (4) 必須以臨時庫、表名必須以暫時庫名🎜>tmp為前綴,並以⽇⽇
(5) 備份庫、表必須以bak為前綴,並以日期為後綴
三、庫、表、字段開發設計規範
(1) 禁⽌使用分區表
(2) 拆分大字段和訪問頻率低的字段,分離冷熱資料
(3) 用HASH進⾏散表,表名後綴使⽤⼗進制數,下標從0開始(4)
按日期時間分錶需符合YYYY[MM][DD][HH]格式 (5)
採用適當的分庫分錶策略。例如千庫十表、十庫百表等(6)
盡量不使用盡量不使用TEXT、BLOB類型
類型 用DECIMAL代替FLOAT和DOUBLE
存儲精確浮點數(8) 越簡單越好:將字符轉化為數字、使用TINYINT來代替ENUM
類型(9) 所有欄位定義為
NOT NULL(10) 使用UNSIGNED
儲存非負整數>
(11) INT型別佔用44
位元組。 (12) 使用timestamp
timestamp(13) 使用INT UNSIGNED
INT UNSIGNEDIPV4(14) 使用
VARBINARY使用VARBINARY大小寫敏感的變長字串
(15) 禁止在資料庫中儲存明文密碼,把密碼加密後儲存
(16) 用好數值類型欄位
Tinyint (1Byte)
mediumint (3Byte)
int (4Byte)int (4Byte) int (4Byte) 🎜>
如果數值字段沒有那麼大,就不要用 bigint
(17) 存儲ip最好用int儲存而非char(15)
(18) 不允許使用ENUM
(19) 避免使用避免使用避免使用
避免使用避免使用
欄位的索引需要額外空間,NULL欄位的複合索引無效(20) 少用text/blob,,
/char >的效能會比text
高很多,實在避免不了
blobblob
,請拆表
(21)
資料庫中不允許儲存大文件,或是照片,可以將大文件物件放到磁碟上,資料庫中儲存它的路徑
四、索引規格
1、索引的數量要控制: 1)
單張表中索引數量不超過5個(2) 單個索引中的字段數不超過5個
(3) 對字串使
⽤⽤
用前綴用前綴 用前綴索引,前綴索引長度不超過
8個字符
(4) 建議優先考慮前綴索引,必要時可添加偽列並建立索引
2、主鍵準則(1) 表格必須有主鍵(2)
(2) 不使用更新頻繁的列作為主鍵(3) 盡量不選擇字串列作為主鍵(4) 不使用UUID MD5 HASH這些作為主鍵(數值太離散了)
(5) 默認使⽤非空的唯一鍵作為主鍵
(6) 建議選擇自增或發號器
3、重要的SQL必須被索引,例如:
必須被索引,例如:(1) UPDATE、DELETE語句的語句的
條件列(2) ORDER BY、、、
GROUP BY、DISTINCT的字段
4、多表JOIN
的欄位注意以下: (1)
區分度最大的字段放在前面
(2)
核
⼼SQL
優先考慮覆蓋索引優先考慮覆蓋索引
優先權>避免冗餘和重複索引
(4) 索引要綜合評估資料密度和分佈以及考慮查詢和更新比例
5、索引禁忌
、索引禁忌、索引禁忌
、索引禁忌、索引禁忌>(1)
不在低基數列上建立索引,例如「性別」
(2) 不在索引列進行數學運算與函數運算6、盡量不使用外鍵(1) 外鍵用來保護參考完整性,可在業務端實現(22 ) 對父表和子表的操作會互相影響,降低可用性
77
索引命名:非唯一索引必須以 idx_欄位1_1_欄位🎜>1_欄位2命名,唯一所以必須以uniq_欄位欄位欄位欄位字段1_字段2命名,索引名稱必須全部小寫 8、新建的唯一索引必須不能和主鍵重複
9、索引欄位的預設值不能為NULL,要改為其他的default或空。 NULL非常影響索引的查詢效率
10 、重複檢視與表格相關的SQL,符合最左字首的特性建立索引。多條欄位重複的語句,要修改語句條件欄位的順序,為其建立一個聯合索引,減少索引數量
11 、能使用唯一索引就要使用唯一索引,提高查詢效率
12、研發要經常使用 explain,如果發現索引選擇性差,必須讓他們學會使用hint
hint
五、SQLSQL規範🎜>(1) sql語句盡量簡單
大的
sql想辦法拆成小的sql
(充分利用
QUERY CACHE並充分利用多核多
避免使用觸發器、函數、預存程序(4🎜>(4 ) 降低業務耦合度,為sacle out、、s>
留有餘地(5) 避免在資料庫中進 ⾏數學運算
(MySQL
判斷)(4) 不要用select *select >,查詢哪幾個欄位就select 這幾個欄位
(5) sql 中使用到OR的改寫為用 IN()的效率沒有in的效率高)
(6) in裡面數字的個數建議控制在1000以內以內
(7) limit分頁注意效率。 Limit越大,效率越低。可以改寫limit,例如範例改寫:
select id fromtlimit; select id from t where id > 10000 limit10;
(9) 用用用
替代union(10) 避免使避免使 > ⽤
大表的JOINJOIN
(111) 使用group by
分組、自動排序
(12) 資料的更新要打散後批次更新,不要一次更新太多資料
(13) 減少與資料庫的互動次數
(13)
注意使用效能分析工具 Sql explain / showprofile / mysqlsla(14) SQL
語句要求所有研發, 🎜>關鍵字全部是大寫,每個字只允許有一個空格(15) SQL語句不可以出現隱式轉換,比如
select id from 表 where id='1'(16) IN條件裡面的數據數量要少,我記得應該是500個以內,要學會用exist代替ininin
>exist在一些場景查詢會比in快(17) 能不用NOT IN
就不用就不用NOTIN,坑太多了。 。會把空和NULL給查出來(18) 在SQL語句中,禁止使用前綴是%%%的like
(19) 不使用負向查詢,如not in/like
(19) 關於分頁查詢:程式裡建議合理使用分頁來提升效率limit,limit,
,
,
,
,,,offset較大要配合子查詢使用(20)
(20)
禁止在🎜>禁止在🎜>禁止在🎜>禁止在🎜>禁止在🎜>禁止在🎜>禁止在🎜>禁止在🎜>禁止在🎜>禁止在🎜>資料庫中跑大查詢(21) 使
使“ 🎜>預編譯語句,只傳參數,比傳遞SQL語句更有效率;一次解析,多次使用;降低SQL注入概率
(22)
禁止使⽤
order by rand()
(23) (23) (23)
(23) 禁
⽌單條SQL單條SQL
六、流程規範(1) 所有的建表操作需要事先告知該表涉及的查詢sql
;
(2) 所有的建表需要確定建立哪些索引後才可以建表上線;(3)
所有的改表結構、加索引操作都需要將涉及到所改表的查詢 sql發出來告知DBA等相關人員;
等相關人員;(4) 在建新表加字段之前,要求研發至少要提前3天郵件出來,給dba們評估、優化和審核的時間
(5) 批次匯入、匯出資料必須事先通知DBA協助觀察(6) 禁⽌在線上從庫執行後台管理和統計類查詢在線上從庫執行後台管理和統計類查詢在線上從庫執行後台管理和統計類查詢(7) 禁⽌有super權限的應用程式帳號存在
(8) 推廣活動或上線新功能必須事先通知DBADBA進 ⾏
行流量評估(9)
(9)
(9) 不在業務高峰期批量更新、查詢資料庫免費領取兄弟連IT教育原創linux運維工程師視頻/細說linux教程,詳情諮詢官網客服:http://www .lampbrother.net/linux/學PHP、Linux、HTML5、UI、Android等影片教學(課件筆記影片)!聯繫Q2430675018
|