阿里數(shù)據(jù)庫開發(fā)規(guī)范:誰還敢說你的數(shù)據(jù)庫設(shè)計的“爛”

數(shù)據(jù)庫設(shè)計幾個規(guī)范:

數(shù)據(jù)庫命名規(guī)范、數(shù)據(jù)庫基本設(shè)計規(guī)范、數(shù)據(jù)庫索引設(shè)計規(guī)范盐须、數(shù)據(jù)庫字段設(shè)計規(guī)范、數(shù)據(jù)庫SQL開發(fā)規(guī)范漆腌、數(shù)據(jù)庫操作行為規(guī)范

數(shù)據(jù)庫命名規(guī)范

1贼邓、所有數(shù)據(jù)庫對象名稱必須使用小寫字母并用下劃線分割

不同的數(shù)據(jù)庫名 DbName dbname

不同的表名 Table table tabLe

2阶冈、所有數(shù)據(jù)庫對象名稱禁止使用MySQL保留關(guān)鍵字

select id,username,from,age from tb_user from是關(guān)鍵字 ,但是可以用單引號括起來

3塑径、數(shù)據(jù)庫對象的命名要見名識義女坑,并且最好不要超過32個字符

例如 用戶數(shù)據(jù)庫mc_userdb 用戶賬號表 user_account

4、臨時庫表必須以tmp為前綴并以日期為后綴

5统舀、備份庫匆骗、備份表必須以bak為前綴并以日期為前綴

6、所有存儲相同數(shù)據(jù)的列名和列類型必須一致

比如兩張表中有相同的數(shù)據(jù)誉简,那么他們列名和列類型必須是一致的

數(shù)據(jù)庫基本設(shè)計規(guī)范

1碉就、所有表必須使用Innodb存儲引擎,mysql 5.6后默認存儲引擎描融,支持事務铝噩,行級鎖,更好的恢復性窿克,高并發(fā)下性能更好

2骏庸、數(shù)據(jù)庫和表的字符集統(tǒng)一使用UTF8,避免由于字符集轉(zhuǎn)換產(chǎn)生的亂碼

mysql中utf8字符集漢字占3個字節(jié)年叮,ASCII碼占用1個字節(jié)

3具被、所有表和字段都需要添加注釋,使用comment從句添加表和列的備注

4只损、盡量控制單表數(shù)據(jù)量的大小一姿,建議控制在500萬以內(nèi),500萬并不是mysql數(shù)據(jù)庫的限制跃惫,

mysql最多可以存儲多少萬數(shù)據(jù)叮叹?目前沒有做限制,這種限制取決于存儲設(shè)置和文件系統(tǒng)

可以用歷史數(shù)據(jù)歸檔爆存,分庫分表等手段來控制數(shù)據(jù)量大小

5蛉顽、謹慎使用mysql分區(qū)表

分區(qū)表在物理上表現(xiàn)為多個文件沒在邏輯上表現(xiàn)為一個表

謹慎選擇分區(qū)鍵,跨分區(qū)查詢效率可能更低

建議采用物理分表的方式管理大數(shù)據(jù)

6先较、盡量做到冷熱數(shù)據(jù)分離携冤,減小表的寬度

mysql限制最多存儲4096列,為了是減少磁盤IO闲勺,保證熱數(shù)據(jù)的內(nèi)存緩存命中率曾棕,利用更有效的利用緩存,避免讀入無用的冷數(shù)據(jù)

經(jīng)常使用的列放在一個表中

7菜循、禁止在表中建立預留字段

預留字段的命名很難做到見名識義

預留字段無法確認存儲的數(shù)據(jù)類型翘地,所以無法選擇合適的類型

對預留字段類型的修改,會對表進行鎖定,修改字段類型的成本往往大于增加

8子眶、禁止在數(shù)據(jù)庫中存儲圖片瀑凝、文件等二進制數(shù)據(jù)

9、禁止在線上做數(shù)據(jù)庫壓力測試

10臭杰、禁止從開發(fā)環(huán)境粤咪,測試環(huán)境直連生產(chǎn)環(huán)境數(shù)據(jù)庫

索引設(shè)計規(guī)范

索引對數(shù)據(jù)庫的查詢性能來說非常重要,查詢渴杆、更新寥枝,禁止濫用索引

1、限制每張表上的索引數(shù)量磁奖,建議單張表索引不超過5個

索引并不是越多越好的囊拜,索引可以提高效率同樣可以降低效率

索引可以增加查詢效率,但同樣也會降低插入和更新的效率

2比搭、禁止給表中的每一列都建立單獨的索引

3冠跷、Innodb是按照主鍵索引的順序來組織表的

4、每個Innodb表必須有一個主鍵

不使用更新頻繁的列作為主鍵身诺,不使用多列主鍵

不使用uuid蜜托、MD5、hash霉赡,字符串列作為主鍵

主鍵建議使用主鍵自增

常見的索引列建議:

select橄务、update、delete語句的where從句中的列

包含在order by穴亏、group by 蜂挪、destinct中的字段

多表join的關(guān)聯(lián)列

如何選擇索引列的順序:

聯(lián)合索引是從做到右的順序來實現(xiàn)的

1、區(qū)分度最高的列放在聯(lián)合索引的最左側(cè)

2嗓化、盡量把字段長度小的列放在聯(lián)合索引的最左側(cè)

3棠涮、使用最頻繁的列放到聯(lián)合索引的左側(cè)

5、避免建立冗余索引和重復索引

重復索引:如 primary key(id)刺覆、index(id)故爵、unique index(id)

冗余索引:如 index(a,b,c) index(a,b) index(a)

6、對于頻繁的查詢優(yōu)先使用覆蓋索引

覆蓋索引:就是包括了所有查詢字段的索引

優(yōu)點:避免Innodb表進行索引的二次查找隅津,可以把隨機IO變?yōu)轫樞騃O加快查詢效率

7、盡量避免使用外鍵

不建議使用外鍵約束劲室,但一定在表與表之間的關(guān)聯(lián)鍵上建立索引

外鍵可用于保證數(shù)據(jù)的參照完整性伦仍,但建議在業(yè)務端實現(xiàn)

外鍵會影響父表和子表的寫操作從而降低性能

數(shù)據(jù)庫字段設(shè)計規(guī)范

1、優(yōu)先選擇符合存儲需要的最小的數(shù)據(jù)類型

將字符串轉(zhuǎn)化為數(shù)字類型存儲

對于非負數(shù)據(jù)采用無符號整形進行存儲

signed int -2147483648-2147483648

unsigned int 0-2147483648

有符號比無符號多出一倍的存儲空間

varchar(n) n代表字符數(shù)很洋,不是字節(jié)數(shù)充蓝,varchar(255)=765個字節(jié)

過大的長度會消耗更多的內(nèi)存

2、避免使用text\BLOB數(shù)據(jù)類型

建議text\BLOB列分離到單獨的擴展表中

text\BLOB類型只能使用前綴索引

3、避免使用enum數(shù)據(jù)類型

修改enum需要使用alter語句

enum類型的order by操作效率低谓苟,需要額外操作

禁止使用數(shù)值作為enum的枚舉值

4官脓、盡可能把所有列定義為not null

索引null列需要額外的空間來保存,所以要占用更多的空間

進行比較和計算時要對null值做特別的處理

5涝焙、禁止字符串存儲日期型的數(shù)據(jù)

缺點1:無法用日期函數(shù)進行計算和比較

缺點2:用字符串存儲日期要占用更多的空間

使用timestamp或datetime類型存儲時間卑笨,timestamp存儲空間更小

6、財務的相關(guān)金額使用decimal類型

decimal類型為精準浮點數(shù)仑撞,在計算時不會丟失精度

float赤兴、double非精準浮點數(shù)

數(shù)據(jù)庫SQL開發(fā)規(guī)范

1、建議使用預編譯語句進行數(shù)據(jù)庫操作

好處:只傳參數(shù)隧哮,比傳遞SQL語句更高效

相同語句可以一次解析桶良,多次使用,提高處理效率

2沮翔、避免數(shù)據(jù)類型的隱式轉(zhuǎn)換

隱式轉(zhuǎn)換會導致索引失效

3陨帆、利用表上已經(jīng)存在的索引

4、禁止連接不同的數(shù)據(jù)庫使用不同的賬號采蚀,禁止垮庫查詢

為數(shù)據(jù)庫遷移和分庫分表留出余地

減低業(yè)務耦合度

避免權(quán)限過大而產(chǎn)生的安全風險

5疲牵、禁止使用select * 必須用select 字段列表 查詢

消耗更多的CPU和io以及網(wǎng)絡帶寬資源

無法使用覆蓋索引

可減少表結(jié)構(gòu)變更帶來的影響

6、禁止使用不含字段列表的insert語句

如搏存,insert into t values(‘a(chǎn)’,’b’,’c’)

7瑰步、避免使用子查詢,可以把子查詢優(yōu)化為join操作

子查詢的結(jié)果集無法使用索引

子查詢會產(chǎn)生臨時表璧眠,如果子查詢數(shù)據(jù)量大則嚴重影響效率

消耗過多的CPU和io資源

8缩焦、避免使用join關(guān)聯(lián)太多的表

每join一個表會多占用一部分內(nèi)存join_buffer_size

會產(chǎn)生臨時表操作,影響查詢效率

mysql最多關(guān)聯(lián)61個表责静,建議不超過5個

9袁滥、減少同數(shù)據(jù)庫的交互次數(shù)

10、禁止使用order by rand()進行隨機排序

11灾螃、where從句中禁止對列進行函數(shù)轉(zhuǎn)換和計算

對列進行函數(shù)轉(zhuǎn)換和計算會導致無法使用索引

如:where date(createtime)=’20160901’

優(yōu)化后:where createtime>=’20160901’

目錄展示

需要更多mysql相關(guān)資料题翻,關(guān)注公眾號:Java架構(gòu)師聯(lián)盟,后臺回復mysql即可獲取腰鬼,更可以查看本文檔的獲取方式

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嵌赠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子熄赡,更是在濱河造成了極大的恐慌姜挺,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彼硫,死亡現(xiàn)場離奇詭異炊豪,居然都是意外死亡凌箕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門词渤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牵舱,“玉大人,你說我怎么就攤上這事缺虐∥弑冢” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵志笼,是天一觀的道長沿盅。 經(jīng)常有香客問我,道長纫溃,這世上最難降的妖魔是什么腰涧? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮紊浩,結(jié)果婚禮上窖铡,老公的妹妹穿的比我還像新娘。我一直安慰自己坊谁,他們只是感情好费彼,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著口芍,像睡著了一般箍铲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鬓椭,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天颠猴,我揣著相機與錄音,去河邊找鬼小染。 笑死翘瓮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的裤翩。 我是一名探鬼主播资盅,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼踊赠!你這毒婦竟也來了呵扛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤筐带,失蹤者是張志新(化名)和其女友劉穎今穿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烫堤,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸽斟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拔创。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖富蓄,靈堂內(nèi)的尸體忽然破棺而出剩燥,到底是詐尸還是另有隱情,我是刑警寧澤立倍,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布灭红,位于F島的核電站,受9級特大地震影響口注,放射性物質(zhì)發(fā)生泄漏变擒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一寝志、第九天 我趴在偏房一處隱蔽的房頂上張望娇斑。 院中可真熱鬧,春花似錦材部、人聲如沸毫缆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苦丁。三九已至,卻和暖如春物臂,著一層夾襖步出監(jiān)牢的瞬間旺拉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工鹦聪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留账阻,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓泽本,卻偏偏與公主長得像淘太,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子规丽,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349