一.基礎(chǔ)規(guī)范
1.必須使用InnoDB存儲引擎
支持事務(wù)抬探、行級鎖、并發(fā)性能更好、CPU及內(nèi)存緩存頁優(yōu)化使得資源利用率更高面氓。
2.新庫必須使用utf8mb4字符集
utf8mb4是utf8的超集羔味,emoji表情以及部分不常見漢字河咽,MySQL 8.0.1以上默認使用utf8mb4
3.數(shù)據(jù)表、數(shù)據(jù)字段必須加入中文注釋
4.禁止使用存儲過程赋元、視圖忘蟹、觸發(fā)器、Event
高并發(fā)大數(shù)據(jù)的互聯(lián)網(wǎng)業(yè)務(wù)搁凸,架構(gòu)設(shè)計思路是“解放數(shù)據(jù)庫CPU媚值,將計算轉(zhuǎn)移到服務(wù)層”,并發(fā)量大的情況下护糖,這些功能很可能將數(shù)據(jù)庫拖死褥芒,業(yè)務(wù)邏輯放到服務(wù)層具備更好的擴展性,能夠輕易實現(xiàn)“增機器就加性能”嫡良。數(shù)據(jù)庫擅長存儲與索引锰扶,CPU計算還是上移吧
5.禁止存儲大文件或者大照片
大文件和照片存儲在文件系統(tǒng),數(shù)據(jù)庫里存URI多好
6.禁止使用負向查詢NOT寝受、!=坷牛、<>、!<很澄、!>京闰、NOT IN锨亏、NOT LIKE等,會導(dǎo)致全表掃描
二.命名規(guī)范
1.只允許使用內(nèi)網(wǎng)域名忙干,而不是ip連接數(shù)據(jù)庫
2.線上環(huán)境器予、開發(fā)環(huán)境、測試環(huán)境數(shù)據(jù)庫內(nèi)網(wǎng)域名遵循命名規(guī)范
3.庫名捐迫、表名乾翔、字段名使用下劃線分割,小寫施戴,不要使用復(fù)數(shù)反浓,不超過32個字符,禁止拼音英文混用
4.表名以tb_開頭為實體表赞哗,以tr_開頭為關(guān)系表雷则,以th_開頭為歷史表等
5.唯一索引名以uk_字段名;普通索引名則以 idx_字段名
三.表設(shè)計規(guī)范
1.單實例mysql表數(shù)目必須小于500
2.單表列數(shù)目必須小于30
3.表必須有主鍵
主鍵遞增肪笋,數(shù)據(jù)行寫入可以提高插入性能月劈,可以避免page分裂,減少表碎片提升空間和內(nèi)存的使用
主鍵要選擇較短的數(shù)據(jù)類型藤乙, Innodb引擎普通索引都會保存主鍵的值猜揪,較短的數(shù)據(jù)類型可以有效的減少索引的磁盤空間,提高索引的緩存效率
無主鍵的表刪除坛梁,在row模式的主從架構(gòu)而姐,會導(dǎo)致備庫夯住
4.禁止使用外鍵,如果有外鍵完整性約束划咐,需要應(yīng)用程序控制
外鍵會導(dǎo)致表與表之間耦合拴念,update與delete操作都會涉及相關(guān)聯(lián)的表,十分影響sql 的性能褐缠,甚至會造成死鎖政鼠。高并發(fā)情況下容易造成數(shù)據(jù)庫性能,大數(shù)據(jù)高并發(fā)業(yè)務(wù)場景數(shù)據(jù)庫使用以性能優(yōu)先
四.字段設(shè)計規(guī)范
1.必須把字段定義為NOT NULL并且提供默認值
null的列使索引/索引統(tǒng)計/值比較都更加復(fù)雜送丰,對MySQL來說更難優(yōu)化
null 這種類型MySQL內(nèi)部需要進行特殊處理缔俄,增加數(shù)據(jù)庫處理記錄的復(fù)雜性;同等條件下器躏,表中有較多空字段的時候俐载,數(shù)據(jù)庫的處理性能會降低很多
null值需要更多的存儲空,無論是表還是索引中每行中的null的列都需要額外的空間來標識
對null 的處理時候登失,只能采用is null或is not null遏佣,而不能采用=、in揽浙、<状婶、<>意敛、!=、not in這些操作符號膛虫。
2.禁止使用TEXT草姻、BLOB類型
會浪費更多的磁盤和內(nèi)存空間,非必要的大量的大字段查詢會淘汰掉熱數(shù)據(jù)稍刀,導(dǎo)致內(nèi)存命中率急劇降低撩独,影響數(shù)據(jù)庫性能
3.禁止使用小數(shù)存儲國幣
使用“分”作為單位,這樣數(shù)據(jù)庫里就是整數(shù)了
4.必須使用varchar(32)存儲手機號
涉及到區(qū)號或者國家代號账月,可能出現(xiàn)±()
5.禁止使用ENUM综膀,可使用TINYINT代替
增加新的ENUM值要做DDL操作
ENUM的內(nèi)部實際存儲就是整數(shù)
6.字段boolean使用unsigned tinyint( 1 表示是,0
表示否)局齿,非負數(shù)使用unsigned剧劝,多值使用枚舉,固定成長度使用char抓歼,不固定使用varchar 長度2的倍數(shù)(長度不要超過 5000,超過使用text讥此,并單獨新建一張表存儲)
7.實體表必備字段 id,create_time,modify_time
8.業(yè)務(wù)上具有唯一性的字段锭部,即使是組合字段暂论,也必須建成唯一索引。
五.索引設(shè)計規(guī)范
1.單表索引最好控制在3個以內(nèi)拌禾,不要超過5個
2.單索引字段數(shù)不允許超過3個
3.禁止在更新十分頻繁、區(qū)分度不高的屬性上建立索引
4.不要新增索引展哭,盡量使用組合索引(注意組合索引的最左原則湃窍,區(qū)分度最高的在最左邊)
5.不要在索引列上使用數(shù)學運算和函數(shù)運算
六.SQL使用規(guī)范
1.禁止使用SELECT *,只獲取必要的字段匪傍,需要顯示說明列屬性
- 讀取不需要的列會增加CPU您市、IO、NET消耗
- 不能有效的利用覆蓋索引
- 使用SELECT *容易在增加或者刪除字段后出現(xiàn)程序BUG
2.禁止使用INSERT INTO tb_xxx VALUES(xxx)役衡,必須顯示指定插入的列屬性
容易在增加或者刪除字段后出現(xiàn)程序BUG
3.禁止使用屬性隱式轉(zhuǎn)換
SELECT uid FROM tb_user WHERE phone=13812345678 會導(dǎo)致全表掃描茵休,而不能命中phone索引
4.禁止在WHERE條件的屬性上使用函數(shù)或者表達式
SELECT uid FROM tb_user WHERE from_unixtime(day)>=‘2017-02-15’ 會導(dǎo)致全表掃描
正確的寫法是:SELECT uid FROM tb_user WHERE day>= unix_timestamp(‘2017-02-15 00:00:00’)
5.禁止負向查詢,以及%開頭的模糊查詢
負向查詢條件:NOT手蝎、!=榕莺、<>、!<棵介、!>钉鸯、NOT IN、NOT LIKE等邮辽,會導(dǎo)致全表掃描
%開頭的模糊查詢唠雕,會導(dǎo)致全表掃描
6.禁止大表使用JOIN查詢贸营,禁止大表使用子查詢。超過三個表禁止 join岩睁。需要 join 的字段钞脂,數(shù)據(jù)類型保持絕對一致;多表關(guān)聯(lián)查詢時捕儒,保證被關(guān)聯(lián)的字段需要有索引芳肌。
對數(shù)據(jù)庫性能影響較大的數(shù)據(jù)庫特性較少使用,解放數(shù)據(jù)庫CPU肋层,把復(fù)雜邏輯計算放到服務(wù)層亿笤。
7.禁止使用OR條件,必須改為IN查詢
8.應(yīng)用程序必須捕獲SQL異常栋猖,并有相應(yīng)處理
9.禁止在主庫上執(zhí)行sum,count等復(fù)雜的耗時統(tǒng)計分析語句
七 .行為規(guī)范
1.禁止使用應(yīng)用程序配置文件內(nèi)的帳號手工訪問線上數(shù)據(jù)庫
2.禁止非DBA對線上數(shù)據(jù)庫進行寫操作净薛,修改線上數(shù)據(jù)需要提交工單,由DBA執(zhí)行蒲拉,提交的SQL語句必須經(jīng)過測試
3.分配非DBA以只讀帳號肃拜,必須通過VPN+跳板機訪問授權(quán)的從庫
4.開發(fā)、測試雌团、線上環(huán)境隔離