MySQL使用規(guī)范備注

一.基礎(chǔ)規(guī)范

1.必須使用InnoDB存儲引擎

支持事務(wù)、行級鎖、并發(fā)性能更好、CPU及內(nèi)存緩存頁優(yōu)化使得資源利用率更高。

2.新庫必須使用utf8mb4字符集

utf8mb4是utf8的超集,emoji表情以及部分不常見漢字,MySQL 8.0.1以上默認(rèn)使用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ù)層具備更好的擴(kuò)展性,能夠輕易實現(xiàn)“增機(jī)器就加性能”。數(shù)據(jù)庫擅長存儲與索引,CPU計算還是上移吧

5.禁止存儲大文件或者大照片

大文件和照片存儲在文件系統(tǒng),數(shù)據(jù)庫里存URI多好

6.禁止使用負(fù)向查詢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 的性能,甚至?xí)斐伤梨i。高并發(fā)情況下容易造成數(shù)據(jù)庫性能,大數(shù)據(jù)高并發(fā)業(yè)務(wù)場景數(shù)據(jù)庫使用以性能優(yōu)先

四.字段設(shè)計規(guī)范

1.必須把字段定義為NOT NULL并且提供默認(rèn)值

  • null的列使索引/索引統(tǒng)計/值比較都更加復(fù)雜,對MySQL來說更難優(yōu)化

  • null 這種類型MySQL內(nèi)部需要進(jìn)行特殊處理,增加數(shù)據(jù)庫處理記錄的復(fù)雜性;同等條件下,表中有較多空字段的時候,數(shù)據(jù)庫的處理性能會降低很多

  • null值需要更多的存儲空,無論是表還是索引中每行中的null的列都需要額外的空間來標(biāo)識

  • 對null 的處理時候,只能采用is null或is not null,而不能采用=、in、<、<>、!=、not in這些操作符號。

2.禁止使用TEXT、BLOB類型

會浪費(fèi)更多的磁盤和內(nèi)存空間,非必要的大量的大字段查詢會淘汰掉熱數(shù)據(jù),導(dǎo)致內(nèi)存命中率急劇降低,影響數(shù)據(jù)庫性能

3.禁止使用小數(shù)存儲國幣

使用“分”作為單位,這樣數(shù)據(jù)庫里就是整數(shù)了

4.必須使用varchar(32)存儲手機(jī)號

涉及到區(qū)號或者國家代號,可能出現(xiàn)±()

5.禁止使用ENUM,可使用TINYINT代替

  • 增加新的ENUM值要做DDL操作

  • ENUM的內(nèi)部實際存儲就是整數(shù)

6.字段boolean使用unsigned tinyint( 1 表示是,0
表示否),非負(fù)數(shù)使用unsigned,多值使用枚舉,固定成長度使用char,不固定使用varchar 長度2的倍數(shù)(長度不要超過 5000,超過使用text,并單獨(dú)新建一張表存儲)

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ù)學(xué)運(yùn)算和函數(shù)運(yùn)算

六.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ù)或者表達(dá)式

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.禁止負(fù)向查詢,以及%開頭的模糊查詢

  • 負(fù)向查詢條件: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ù)庫進(jìn)行寫操作,修改線上數(shù)據(jù)需要提交工單,由DBA執(zhí)行,提交的SQL語句必須經(jīng)過測試

3.分配非DBA以只讀帳號,必須通過VPN+跳板機(jī)訪問授權(quán)的從庫

4.開發(fā)、測試、線上環(huán)境隔離

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,958評論 0 9
  • 今天看到一位朋友寫的mysql筆記總結(jié),覺得寫的很詳細(xì)很用心,這里轉(zhuǎn)載一下,供大家參考下,也希望大家能關(guān)注他原文地...
    信仰與初衷閱讀 4,832評論 0 30
  • 一、MySQL優(yōu)化 MySQL優(yōu)化從哪些方面入手: (1)存儲層(數(shù)據(jù)) 構(gòu)建良好的數(shù)據(jù)結(jié)構(gòu)。可以大大的提升我們S...
    寵辱不驚丶?xì)q月靜好閱讀 2,652評論 1 8
  • 2017年1月6日群資料整理目錄 出彩分享一:希坦情緒密碼六十秒分享——1.4 出彩分享二:希坦情緒密碼六十秒分享...
    麗的自白書閱讀 480評論 0 0
  • 我是一個勞工 每天飽受疾病的糾纏, 我去教堂修女嫌我亂, 我去餐館經(jīng)理罵我滾蛋, 我去醫(yī)院大夫指著我的額頭說我沒有...
    無敵的鯉魚閱讀 302評論 2 3

友情鏈接更多精彩內(nèi)容