數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)范與原則/分區(qū)分表

一,數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)范
1.數(shù)據(jù)庫(kù)命名規(guī)范?
? ?采用26個(gè)英文字母(區(qū)分大小寫)和0-9的自然數(shù)(經(jīng)常不需要)加上下劃線'_'組成;?
? ?例如:user,?stat,?log,?也可以wifi_user,?wifi_stat,?wifi_log給數(shù)據(jù)庫(kù)加個(gè)前綴;?
2.數(shù)據(jù)表命名規(guī)范? ?
? ?采用26個(gè)英文字母(區(qū)分大小寫)和0-9的自然數(shù)(經(jīng)常不需要)加上下劃線'_'組成;??
? ??命名簡(jiǎn)潔明確,多個(gè)單詞用下劃線'_'分隔;???
3.數(shù)據(jù)表字段命名規(guī)范??
采用26個(gè)英文字母(區(qū)分大小寫)和0-9的自然數(shù)(經(jīng)常不需要)加上下劃線'_'組成;?
命名簡(jiǎn)潔明確,多個(gè)單詞用下劃線'_'分隔;?
例如:user_login表段?user_id,?user_name,?pass_word,?eamil,?tickit,?status,?mobile,?add_time;? 4.字段類型規(guī)范??
用盡量少的存儲(chǔ)空間來(lái)存數(shù)一個(gè)字段的數(shù)據(jù);? 例如:能使用int就不要使用varchar、char,能用varchar(16)就不要使用varchar(256);?
IP地址最好使用int類型;?
固定長(zhǎng)度的類型最好使用char,例如:郵編;?
能使用tinyint就不要使用smallint,int;?
最好給每個(gè)字段一個(gè)默認(rèn)值,最好不能為null;
5.數(shù)據(jù)庫(kù)表索引規(guī)范
?命名簡(jiǎn)潔明確,例如:user_login表user_name字段的索引應(yīng)為user_name_index唯一索引;?
6.簡(jiǎn)單熟悉數(shù)據(jù)庫(kù)范式(三大范式)
第一范式(1NF):字段值具有原子性,不能再分(所有關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)都滿足第一范式);? 例如:姓名字段,其中姓和名是一個(gè)整體,如果區(qū)分姓和名那么必須設(shè)立兩個(gè)獨(dú)立字段;?
第二范式(2NF):一個(gè)表必須有主鍵,即每行數(shù)據(jù)都能被唯一的區(qū)分;
第三范式(3NF):一個(gè)表中不能包涵其他相關(guān)表中非關(guān)鍵字段的信息,即數(shù)據(jù)表不能有沉余字段;?
二.MYSQL數(shù)據(jù)庫(kù)設(shè)計(jì)原則?
1.核心原則
? ? ? ?不在數(shù)據(jù)庫(kù)做運(yùn)算或?qū)憳I(yè)務(wù)邏輯(存儲(chǔ)過(guò)程,觸發(fā)器);??控制列數(shù)量(字段少而精,字段數(shù)建議在20以內(nèi));??平衡范式與冗余(效率優(yōu)先;往往犧牲范式) ; 拒絕3B(拒絕大sql語(yǔ)句:big?sql、拒絕大事物:bigtransaction、拒絕大批量:big?batch);???
2.字段類原則
用好數(shù)值類型(用合適的字段類型節(jié)約空間);??
字符轉(zhuǎn)化為數(shù)字(能轉(zhuǎn)化的最好轉(zhuǎn)化,同樣節(jié)約空間、提高查詢性能);?
避免使用NULL字段(NULL字段很難查詢優(yōu)化、NULL字段的索引需要額外空間、NULL字段的復(fù)合索引無(wú)效);?
少用text類型(盡量使用varchar代替text字段);??
3.索引類原則??
合理使用索引(改善查詢,減慢更新,索引一定不是越多越好);?
字符字段必須建前綴索引;??不在索引做列運(yùn)算;??
innodb主鍵推薦使用自增列(主鍵建立聚簇索引,主鍵不應(yīng)該被修改,字符串不應(yīng)該做主鍵)(理解Innodb的索引保存結(jié)構(gòu)就知道了);? 減少使用外鍵(由程序保證約束);
4.sql類原則?
sql語(yǔ)句盡可能簡(jiǎn)單;簡(jiǎn)單的事務(wù);???避免使用trig/func(觸發(fā)器、函數(shù)不用客戶端程序取而代之);
?不用select?*(消耗cpu,io,內(nèi)存,帶寬,這種程序不具有擴(kuò)展性);??
條件查詢or改為IN;OR改寫為UNION(mysql的索引合并很弱智);??
?避免負(fù)向%;? 如id !=1;少用連接join;??
===========================================================
三.mysql分區(qū)分表
(1)簡(jiǎn)介
mysql數(shù)據(jù)庫(kù)中的數(shù)據(jù)是以文件的形式存在磁盤上的,默認(rèn)放在/mysql/data下面(可以通過(guò)my.cnf中的datadir來(lái)查看)。
使用myisam引擎的一張表主要對(duì)應(yīng)著三個(gè)文件,一個(gè)是frm存放表結(jié)構(gòu)的,一個(gè)是myd存放表數(shù)據(jù)的,一個(gè)是myi存表索引的。使用innoDB引擎的/mysql/data/數(shù)據(jù)庫(kù)名目錄下一張表有一個(gè)frm文件存放數(shù)據(jù)結(jié)構(gòu),其他的數(shù)據(jù)部分全部都存在在/mysql/data目錄下的ibdata文件中。

(2)分表分區(qū)是什么?
? ??分表是將一個(gè)大表按照一定的規(guī)則分解成多張具有獨(dú)立存儲(chǔ)空間的實(shí)體表,我們可以稱為子表,每個(gè)表都對(duì)應(yīng)三個(gè)文件,MYD數(shù)據(jù)文件,.MYI索引文件,.frm表結(jié)構(gòu)文件。這些子表可以分布在同一塊磁盤上,也可以在不同的機(jī)器上。
????分區(qū)就是把一張表的數(shù)據(jù)分成N多個(gè)區(qū)域,分區(qū)后,表面上還是一張表,但數(shù)據(jù)散列到多個(gè)位置根據(jù)數(shù)據(jù)量的大小,結(jié)合實(shí)際業(yè)務(wù)。
(3)分區(qū)
mysql5.1及以上支持分區(qū)功能?
分區(qū)方式有:range分區(qū),list分區(qū),hash分區(qū),key分區(qū),子分區(qū)。
①range分區(qū)? ? ?
?建表的時(shí)候添分區(qū)按照id的范圍

CREATE?TABLE?IF?NOT?EXISTS?`user`?(? ?
id int ........
?)?ENGINE=MyISAM??DEFAULT?CHARSET=utf8?AUTO_INCREMENT=1???-PARTITION?BY?RANGE?(id)?(? ? ?
? ?PARTITION?p0?VALUES?LESS?THAN?(3),? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?PARTITION?p1?VALUES?LESS?THAN?(6),? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?PARTITION?p2?VALUES?LESS?THAN?MAXVALUE,? ? ? ? ? ? ? ? ? ? ? ? ? ??);

對(duì)現(xiàn)有的表進(jìn)行分區(qū)

alter?table?aa?partition?by?RANGE(id)(
PARTITION?p1?VALUES?less?than?(1),? ?
PARTITION?p2?VALUES?less?than?(5),???- PARTITION?p3?VALUES?less?than?MAXVALUE);??
//刪除一個(gè)分區(qū)??
?alter?table?aa?drop?partition?p2;??

②list分區(qū)
LIST分區(qū)中每個(gè)分區(qū)的定義和選擇是基于某列的值從屬于一個(gè)值列表集中的一個(gè)值,而RANGE分 區(qū)是從屬于一個(gè)連續(xù)區(qū)間值的集合。如下:
官方文檔規(guī)定??LIST 分區(qū)是,分區(qū)字段必須包含在主鍵字段內(nèi)

CREATE?TABLE?IF?NOT?EXISTS?`list_part`?(? `id`?int(11)?NOT?NULL COMMENT?'用戶ID',??
`province_id`?int(2)?NOT?NULL?DEFAULT?0?COMMENT?'省',??
)?ENGINE=INNODB??DEFAULT?CHARSET=utf8? AUTO_INCREMENT=1???-PARTITION?BY?LIST?(province_id)?(?
PARTITION?p0?VALUES?IN?(1,2,3,4,5,6,7,8),? ? PARTITION?p1?VALUES?IN?(9,10,11,12,16,21),? PARTITION?p2?VALUES?IN?(13,14,15,19),? ? PARTITION?p3?VALUES?IN?(17,18,20,22,23,24)? ?);??

③hash分區(qū)
HASH分區(qū)主要用來(lái)確保數(shù)據(jù)在預(yù)先確定數(shù)目的分區(qū)中平均分布,你所要做的只是基于將要被哈希的列值指定一個(gè)列值或表達(dá)式,以 及指定被分區(qū)的表將要被分割成的分區(qū)數(shù)量。

CREATE?TABLE?IF?NOT?EXISTS?`hash_part`?(? ? ?`id`?int(11)?NOT?NULL?AUTO_INCREMENT?COMMENT?'評(píng)論ID',? ? ?`comment`?varchar(1000)?NOT?NULL?DEFAULT?''?COMMENT?'評(píng)論',? ? ? `ip`?varchar(25)?NOT?NULL?DEFAULT?''?COMMENT?'來(lái)源IP',? ? ? PRIMARY?KEY?(`id`)? ? )?ENGINE=INNODB??DEFAULT?CHARSET=utf8?AUTO_INCREMENT=1? ? PARTITION?BY?HASH(id)???->?PARTITIONS?3;?

④key分區(qū)
按照KEY進(jìn)行分區(qū)類似于按照HASH分區(qū),除了HASH分區(qū)使用的用 戶定義的表達(dá)式,而KEY分區(qū)的 哈希函數(shù)是由MySQL 服務(wù)器提供。

CREATE?TABLE?IF?NOT?EXISTS?`key_part`?(? ? ? `news_id`?int(11)?NOT?NULL??COMMENT?'新聞ID',? ? ?`content`?varchar(1000)?NOT?NULL?DEFAULT?''?COMMENT?'新聞內(nèi)容',? ? ? `u_id`?varchar(25)?NOT?NULL?DEFAULT?''?COMMENT?'來(lái)源IP',? ? ? `create_time`?DATE?NOT?NULL?DEFAULT?'0000-00-00?00:00:00'?COMMENT?'時(shí)間'? ?)?ENGINE=INNODB??DEFAULT?CHARSET=utf8? ? PARTITION?BY?LINEAR?HASH(YEAR(create_time))???
PARTITIONS?3;??

⑤子分區(qū)
子分區(qū)是分區(qū)表中每個(gè)分區(qū)的再次分割,子分區(qū)既可以使用HASH希分區(qū),也可以使用KEY分區(qū)。這 也被稱為復(fù)合分區(qū)(composite partitioning)。
? 1,如果一個(gè)分區(qū)中創(chuàng)建了子分區(qū),其他分區(qū)也要有子分區(qū)
? 2,如果創(chuàng)建了了分區(qū),每個(gè)分區(qū)中的子分區(qū)數(shù)必有相同
? 3,同一分區(qū)內(nèi)的子分區(qū),名字不相同,不同分區(qū)內(nèi)的子分區(qū)名子可以相同(5.1.50不適用)

CREATE?TABLE?IF?NOT?EXISTS?`sub_part`?(? ? ?`news_id`?int(11)?NOT?NULL??COMMENT?'新聞ID',? ? ?`content`?varchar(1000)?NOT?NULL?DEFAULT?''?COMMENT?'新聞內(nèi)容',? ? ? `u_id`??int(11)?NOT?NULL?DEFAULT?0s?COMMENT?'來(lái)源IP',? ? ? `create_time`?DATE?NOT?NULL?DEFAULT?'0000-00-00?00:00:00'?COMMENT?'時(shí)間'? ? )?ENGINE=INNODB??DEFAULT?CHARSET=utf8? ? PARTITION?BY?RANGE(YEAR(create_time))? SUBPARTITION?BY?HASH(TO_DAYS(create_time))(? ? PARTITION?p0?VALUES?LESS?THAN?(1990)(SUBPARTITION?s0,SUBPARTITION?s1,SUBPARTITION?s2),? ? PARTITION?p1?VALUES?LESS?THAN?(2000)(SUBPARTITION?s3,SUBPARTITION?s4,SUBPARTITION?good),? ? PARTITION?p2?VALUES?LESS?THAN?MAXVALUE(SUBPARTITION?tank0,SUBPARTITION?tank1,SUBPARTITION?tank3));?

⑥分區(qū)管理⑦⑧⑨⑩
? ?1,刪除分區(qū)
? ??alter?table?user?drop?partition?p4;??
? ?2,新增分區(qū)
? ? range添加新分區(qū)?
? ?
alter?table?user?add?partition(partition?p4?values?less?than?MAXVALUE);
? ??list添加新分區(qū)
? ? alter?table?list_part?add?partition(partition?p4?values?in?(25,26,28));??
? ?hash重新分區(qū)?
? ? alter?table?hash_part?add?partition?partitions?4;??
? ?key重新分區(qū)
? ? alter?table?key_part?add?partition?partitions?4;







?

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

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

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