說(shuō)到MySQL, 大家都很熟悉,因?yàn)檫@是我們工作中不可避免會(huì)使用到的技術(shù),但是你真正的掌握了它嗎?還是每天在重復(fù)crud呢!那么怎么樣告別crud呢!來(lái)到這里就對(duì)了。簡(jiǎn)單概念的上的東西我就不提了。直接上技術(shù)。
數(shù)據(jù)庫(kù)三大范式
第一范式1NF:
數(shù)據(jù)表中的字段,必須是不可拆分的最小單元,也就是確保每一個(gè)字段的原子性。例如:
那么怎么去設(shè)計(jì)才是正確的呢?其中 address 可以再分為省、市、地區(qū)、街道、名牌號(hào),違反了第一范式。
既然要滿足原子性不可以分割,我們把這些可以拆分的數(shù)據(jù)都給拆分出來(lái)不就行了嗎?以下是筆者拆分后的數(shù)據(jù)。
第二范式2NF:使用的時(shí)候只需與此表關(guān)聯(lián)即可。
滿足1NF的基礎(chǔ)上,要求:表中的所以列,都必需依賴主鍵,而不能有任何一列與主鍵沒(méi)有關(guān)系。言下之意就是一個(gè)表設(shè)計(jì)只能描述一件事情,不能把其它
無(wú)關(guān)的也嵌入進(jìn)來(lái)。第二范式消除了表的無(wú)關(guān)數(shù)據(jù)。
那么怎么去設(shè)計(jì)才是正確的呢?其中 address 可以再分為省、市、地區(qū)、街道、名牌號(hào),違反了第一范式。
此表中區(qū)域地址和你的用戶心情毫無(wú)關(guān)系。正確的做法就是建立另外一張描述你情緒的表。
第三范式 3NF:
滿足2NF的基礎(chǔ)上,任何非主字段不依賴與其它非主字段,在2NF基礎(chǔ)上消除傳遞依賴,也就是我們不允許設(shè)計(jì)的字段不能出現(xiàn)冗余現(xiàn)象。
我們從這幾張表中可以看出province,city,district,street,detailaddress,doorid都是依賴于region_id,所以不滿足第三范式。
筆者再多分享一點(diǎn)給大家,在實(shí)際工作當(dāng)中,我們可能會(huì)反3NF,那么什么時(shí)候去反3NF呢?舉個(gè)實(shí)際工作當(dāng)中的例子吧!例如我們?cè)谝粋€(gè)訂單中可能需要關(guān)聯(lián)到用戶,我們查看訂單的時(shí)候需要顯示出用戶名,用戶的其它信息就不用顯示出來(lái)了,如果不反三范式我們 查詢都需要關(guān)聯(lián)用戶表,如果查詢很普遍的話,就會(huì)影響到性能,所以我們干脆就可以把用戶名這個(gè)字段設(shè)計(jì)到訂單中。這樣就可以提高性能。在實(shí)際工作中靈活運(yùn)用。
數(shù)據(jù)庫(kù)五大約束
1、主鍵約束(primary key)
唯一性,非null性
2、唯一約束 (unique)
唯一性,可以空,單只能有一個(gè)
3、檢查約束 (check)
對(duì)該列數(shù)據(jù)的范圍、格式的限制(如:年齡、性別等)
4、默認(rèn)約束(default)
該數(shù)據(jù)的默認(rèn)值
5、外鍵約束(foreign key)
建立兩表之間的關(guān)系
數(shù)據(jù)庫(kù)事務(wù)
數(shù)據(jù)庫(kù)事務(wù)是什么?
指的是單個(gè)邏輯工作單元執(zhí)行的一系列操作,要么全部執(zhí)行成功,要么完全不執(zhí)行。
事務(wù)的四大特性
原子性
原子性是指事務(wù)包含的所有一系列操作要么全部成功提交,要么全部失敗回滾。它是數(shù)據(jù)庫(kù)事務(wù)最本質(zhì)的特性。
一致性
一致性是指在事務(wù)開(kāi)始之前和結(jié)束以后,數(shù)據(jù)庫(kù)的完整性約束沒(méi)有被破壞,這是說(shuō)數(shù)據(jù)庫(kù)事務(wù)不能破壞關(guān)系數(shù)據(jù)的完整性以及業(yè)務(wù)邏輯上的一致性、這里有個(gè)容易混淆點(diǎn),容易和數(shù)據(jù)一致性混淆。這里更多的強(qiáng)調(diào)單機(jī)下的事務(wù)一致性,必須是一個(gè)事務(wù)內(nèi)部。
隔離性
每個(gè)事務(wù)都有各自的資源單位,事務(wù)與事務(wù)之間是互相隔離的、不可見(jiàn),而事務(wù)的結(jié)果是對(duì)其它事務(wù)是可見(jiàn)的。這里可以理解為資源粒子度的劃分與隔離。
持久性
持久性確保的是一旦提交了事務(wù),出現(xiàn)系統(tǒng)故障,該事物的更新也不會(huì)丟失??梢岳斫鉃槌志没酱疟P(pán)中。
事務(wù)的四種隔離級(jí)別
隔離級(jí)別由低到高分別為
讀未提交(READ_UNCOMMITTED)
就是一個(gè)事務(wù)A去讀取一個(gè)事務(wù)B未提交的數(shù)據(jù)。如果B事務(wù)出現(xiàn)回滾,那么事務(wù)A就會(huì)出現(xiàn)臟讀的問(wèn)題。
讀已提交 (READ_COMMINTED)
一個(gè)事務(wù)A讀取一個(gè)事務(wù)B已提交的數(shù)據(jù),解決了臟讀問(wèn)題,但是在一個(gè)事務(wù)范圍內(nèi)兩個(gè)相同的查詢卻返回了不同的數(shù)據(jù),那么這就是不可重復(fù)讀。
可重復(fù)讀 (REPETABLE_READ)
事務(wù)開(kāi)啟時(shí),不再允許其它的事務(wù)修改數(shù)據(jù)。這樣就可以無(wú)限制讀取沒(méi)有被修改的數(shù)據(jù),解決了不可重復(fù)讀,當(dāng)有并行插入操作時(shí)候就會(huì)出現(xiàn)幻讀。
可串行化(SERIALIZABLE)
在可串行化的隔離級(jí)別下,將事務(wù)串行化順序執(zhí)行。那么事務(wù)不能進(jìn)行并行操作,也就解決了幻讀的問(wèn)題。
MYSQL InnoDB 引擎默認(rèn)事務(wù)隔離級(jí)別是可重復(fù)讀(REPEATABLE_READ) ORACLE 引擎默認(rèn)事務(wù)隔離級(jí)別是可串行化(SERIALIZABLE)
InnoDB 索引
innoDB特性
- 完全的事務(wù)支持
- 基于行存儲(chǔ)的行級(jí)鎖
- 多版本并發(fā)控制
- 原子死鎖檢測(cè)
- 原子崩潰恢復(fù)
innodb 架構(gòu)圖
innodb 邏輯存儲(chǔ)結(jié)構(gòu)
在 innodb下,所有的數(shù)據(jù)都存儲(chǔ)在一個(gè)表空間中,表空間又由段(segment)、 區(qū)(extent)、 頁(yè)(page)、行(row)組成,頁(yè)在有些文檔中也成為塊(block) 1 extent = 64 page
innodb 存儲(chǔ)結(jié)構(gòu)圖
B-tree
定義:B樹(shù)滿足如下條件,即可稱之為m階B樹(shù):
- 每個(gè)節(jié)點(diǎn)最多可以擁有m棵子樹(shù);
- 根節(jié)點(diǎn)最少擁有2棵子樹(shù)(存在子樹(shù)的情況下);
- 除了根節(jié)點(diǎn)以外,其余每個(gè)分支節(jié)點(diǎn)至少擁有m/2棵子樹(shù);
- 所有的頁(yè)節(jié)點(diǎn)都在同一層上;
- 有k棵子樹(shù)的分支節(jié)點(diǎn)則存在k-1個(gè)關(guān)鍵碼,關(guān)鍵碼按照遞增次序進(jìn)行排列;
- 關(guān)鍵子樹(shù)量需要滿足ceil(m/2)-1 <= n <= m-1;
b樹(shù)圖
B-tree 的特點(diǎn)是每個(gè)節(jié)點(diǎn)不僅存放鍵值,而且存放數(shù)據(jù)。
b+tree圖
B+樹(shù)特點(diǎn):1. 所有的葉子節(jié)點(diǎn)中包含了全部元素的信息,及指向含這些元素記錄的指針,且葉子節(jié)點(diǎn)本身依關(guān)鍵字的大小自小而大順序鏈接。2. 所有的中間節(jié)點(diǎn)元素都同時(shí)存在于子節(jié)點(diǎn),在子節(jié)點(diǎn)元素中是最大(或最小)元素。
B+樹(shù)的優(yōu)點(diǎn):1. 單一節(jié)點(diǎn)存儲(chǔ)更多的元素(因?yàn)椴缓袑?duì)應(yīng)的值,僅僅含有鍵),使得查詢的IO次數(shù)更少。2. 所有查詢都要從跟節(jié)點(diǎn)查找到葉子節(jié)點(diǎn),查詢性能穩(wěn)定,相對(duì)于B樹(shù)更加穩(wěn)定,因?yàn)锽+樹(shù)只有葉子節(jié)點(diǎn)存儲(chǔ)了對(duì)應(yīng)的值信息。3. 所有葉子節(jié)點(diǎn)形成有序雙向鏈表,對(duì)于SQL的范圍查詢以及排序查詢都很方便。4. b/b+樹(shù)的共同優(yōu)點(diǎn):每個(gè)節(jié)點(diǎn)有更多的孩子,插入不需要改變樹(shù)的高度,從而減少重新平衡的次數(shù),非常適合做數(shù)據(jù)庫(kù)索引這種需要持久化在磁盤(pán),同時(shí)需要大量查詢和插入的應(yīng)用。樹(shù)中節(jié)點(diǎn)存儲(chǔ)這指向頁(yè)的信息,可以快速定位到磁盤(pán)對(duì)應(yīng)的頁(yè)上面。
Mysql 鎖總結(jié)
鎖不僅是資源占有的一種處理機(jī)制,更是多線程或并發(fā)編程下對(duì)數(shù)據(jù)一致性的一種保證。加鎖和釋放鎖本身也會(huì)消耗資源。了解并合理利用鎖機(jī)制,能大大提升數(shù)據(jù)庫(kù)的性能。鎖的作用者是事務(wù),也就是說(shuō),鎖是針對(duì)事務(wù)使用而言。單個(gè)操作不顯示的開(kāi)啟和提交/回滾事務(wù),默認(rèn)情況下每個(gè)操作會(huì)自動(dòng)開(kāi)啟一個(gè)事務(wù)。
共享鎖
一個(gè)事務(wù)對(duì)數(shù)據(jù)加共享鎖,也可以允許其它事務(wù)對(duì)此交集數(shù)據(jù)加此鎖。但阻止其它事務(wù)對(duì)此交集數(shù)據(jù)加排他鎖。
加共享鎖語(yǔ)句:SELECT * FRPM TABLE_NAME WHERE LOCK IN SHARE MODE;
排他鎖
一個(gè)事務(wù)對(duì)數(shù)據(jù)加排他鎖,會(huì)阻止其它事務(wù)對(duì)此交集數(shù)據(jù)加任和鎖。
加排他鎖語(yǔ)句:SELECT * FROM TABLE_NAME WHERE FOR UPDATE;
意向鎖
為了允許行鎖和表鎖共存,實(shí)現(xiàn)多粒度鎖機(jī)制,InoDB還有兩種內(nèi)部使用的意向鎖,在這里的兩種意向鎖都是表鎖。
意向共享鎖
事務(wù)打算給數(shù)據(jù)行共享鎖,事務(wù)在給一個(gè)數(shù)據(jù)行加共享鎖前必須先取得該表的意向共享鎖。
意向排他鎖
事務(wù)打算給數(shù)據(jù)行加排他鎖,事務(wù)在給一個(gè)數(shù)據(jù)行加排他鎖前必須先取得該表的意向排他鎖。
意向鎖是innodb 自動(dòng)加的,不需要用戶干預(yù)。
表級(jí)鎖
每個(gè)事務(wù)操作會(huì)鎖住整張表,粒子度最大,簡(jiǎn)單粗暴。優(yōu)點(diǎn)是加鎖和釋放鎖次數(shù)會(huì)大大減少。缺點(diǎn)是鎖沖突的概率會(huì)大大增加,高并發(fā)情況下不可取。
頁(yè)級(jí)鎖
資源開(kāi)銷介于行級(jí)鎖和表級(jí)鎖,會(huì)出現(xiàn)死鎖。
行級(jí)鎖
每個(gè)事務(wù)僅會(huì)鎖住被影響的行,也就是說(shuō),涉及到哪些行記錄,哪些行才會(huì)被鎖住,會(huì)出現(xiàn)死鎖。優(yōu)點(diǎn)是鎖沖突概率小,并發(fā)度高。缺點(diǎn)是由于鎖離子度小,加鎖和釋放鎖的次數(shù)大大增加,資源開(kāi)銷大。
mysql的行級(jí)鎖通過(guò)索引項(xiàng)上的索引來(lái)實(shí)現(xiàn)的,innodb這種行鎖實(shí)現(xiàn)特點(diǎn)意味著只有通過(guò)索引條件檢索數(shù)據(jù),innodb才會(huì)使用行級(jí)鎖,否則,innodb將使用表鎖。
間隙鎖(Next-Key鎖)
當(dāng)我們用范圍條件而不是相等條件檢索數(shù)據(jù),并請(qǐng)求共享鎖或排他鎖時(shí),innodb會(huì)給符合條件的已有數(shù)據(jù)的索引項(xiàng)加鎖;對(duì)于鍵值在條件范圍內(nèi)但并不存在的記錄,叫做間隙,innodb也會(huì)對(duì)這個(gè)間隙加鎖,這種鎖機(jī)制不是所謂的間隙鎖。InnoDb使用間隙鎖的目的,一方面是為了防止幻讀,以滿足相關(guān)隔離級(jí)別的要求,對(duì)于上面的例子,要是不使用間隙鎖,如果其它事務(wù)插入更改了任何記錄,那么本事務(wù)再次執(zhí)行上述語(yǔ)句,就會(huì)發(fā)生幻讀;另一方面,是為了滿足其恢復(fù)和復(fù)制的需要,有關(guān)恢復(fù)和復(fù)制機(jī)制的影響,以及不同隔離級(jí)別下innodb使用間隙鎖的情況。
很顯然,在使用范圍條件檢索并鎖定記錄時(shí),innodb對(duì)這種加鎖機(jī)制會(huì)阻塞符合條件范圍內(nèi)鍵值的并發(fā)插入,這往往會(huì)造成嚴(yán)重的鎖等待。因此,在實(shí)際開(kāi)發(fā)中,尤其是并發(fā)插入比較多的應(yīng)用,我們盡量?jī)?yōu)化業(yè)務(wù)邏輯,盡量使用相等條件來(lái)訪問(wèn)更新數(shù)據(jù),避免使用范圍條件。
死鎖
死鎖是指兩個(gè)或多個(gè)事務(wù)在同一個(gè)資源上相互占用,并請(qǐng)求鎖定對(duì)方占用的資源,從而導(dǎo)致惡性循環(huán)。當(dāng)事務(wù)試圖以不同的順序鎖定資源時(shí),就可能產(chǎn)生死鎖。多個(gè)事務(wù)同時(shí)鎖定同一個(gè)資源時(shí)也可能產(chǎn)生死鎖。
innodb避免死鎖
- 為了在單個(gè)innodb表上執(zhí)行多個(gè)并發(fā)寫(xiě)入操作時(shí)避免死鎖,可以在事務(wù)開(kāi)始時(shí)通過(guò)為預(yù)期要修改的每個(gè)記錄(行) 使用SELECT ... FOR UPDATE 語(yǔ)句來(lái)獲取必要的鎖,即使這些行的更改語(yǔ)句是在之后才執(zhí)行的。
- 在事務(wù)中,如果要更新記錄,應(yīng)該直接申請(qǐng)足夠級(jí)別的鎖,即排他鎖,而不應(yīng)先申請(qǐng)共享鎖、更新時(shí)再申請(qǐng)排他鎖,因?yàn)檫@時(shí)候當(dāng)用戶在申請(qǐng)排他鎖時(shí),其它事務(wù)可能又已經(jīng)獲取了相同記錄的共享鎖,從而造成鎖沖突,甚至死鎖
- 如果事務(wù)需要修改或鎖定多個(gè)表,則應(yīng)在每個(gè)事務(wù)中以相同的順序使用加鎖語(yǔ)句。在應(yīng)用中,如果不同的程序會(huì)并發(fā)存取多個(gè)表,應(yīng)盡量約定以相同的順序來(lái)訪問(wèn)表,這樣可以大大降低死鎖的機(jī)會(huì)
- 同過(guò)SELECT...LOCK IN SHARE MODE 獲取行的讀鎖后,如果當(dāng)前事務(wù)再需要對(duì)該記錄進(jìn)行更新操作,則很可能造成死鎖。
- 改變事務(wù)隔離級(jí)別
如果出現(xiàn)死鎖,可以使用SHOW INNODB STATUS 命令來(lái)確定最后一個(gè)死鎖產(chǎn)生的原因。返回結(jié)果中包括死鎖相關(guān)事務(wù)的詳細(xì)信息。如引發(fā)的SQL語(yǔ)句,事務(wù)已經(jīng)獲得的鎖,正在等待什么鎖,以及被回滾的事務(wù)等。據(jù)此可以分析死鎖產(chǎn)生的原因和改進(jìn)措施。
樂(lè)觀鎖
加鎖是為了占用資源,我們上面說(shuō)過(guò)加鎖和釋放鎖都會(huì)有資源開(kāi)銷。在有些不需要加鎖就能獲取資源豈不是更好?樂(lè)觀鎖是樂(lè)觀的認(rèn)為在搶占資源是不用加鎖就能獲取資源(因?yàn)闆](méi)有其它事務(wù)搶占資源或者發(fā)生的沖突概率小,稍稍嘗試幾次就能成功,美滋滋)。適用沖突概率小的情景下。
悲觀鎖
在沖突概率大的情況下,悲觀的認(rèn)為搶不到資源或者多次都搶不到資源。只能通過(guò)加鎖的方式搶占資源,然后再做處理,最后釋放資源。
SQL優(yōu)化
優(yōu)化必備的explain命令
explain命令是用來(lái)查詢SQL的執(zhí)行計(jì)劃 用法:explain select filed from table;
會(huì)查詢出以下重要字段:
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-----------------------+ | id | selecttype | table | partitions | type | possiblekeys | key | keylen | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-----------------------+ | 1 | SIMPLE | t0 | NULL | range | idxtradeid | idxtrade_id | 8 | NULL | 2 | 100.00 | Using index condition | +----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-----------------------+ 1 row in set (0.02 sec)
重要字段說(shuō)明:
select_type:使用的select查詢類型,比如simple、primary、union、subquery等;
table:關(guān)于訪問(wèn)哪張表,如果是多表,則按訪問(wèn)的先后排序排列;
type:非常非常重要的指標(biāo),表示mysql在表中找到行記錄的方式,又稱訪問(wèn)類型。訪問(wèn)類型的性能指標(biāo)從差到好依次是system > const > eqref > ref > fulltext > refornull ? indexmerge > uniquesubquery > indexsubquery > range > index > ALL, 一般來(lái)說(shuō),得保證查詢至少達(dá)到range級(jí)別,最好能達(dá)到ref,否則可能出現(xiàn)性能問(wèn)題;
possible_keys: 可能用到的所以,如果為null,表示沒(méi)有可能用到的索引;
key:用到的索引,如果為null,表示沒(méi)有使用索引;
key_len: 按字節(jié)計(jì)算的索引長(zhǎng)度,值越小,表示越快;
ref:關(guān)聯(lián)關(guān)系中另一個(gè)表的列名稱;
rows: 查詢數(shù)據(jù)返回的行數(shù);
extra:與關(guān)聯(lián)操作有關(guān)的信息
索引優(yōu)化
1.禁止無(wú)邊界范圍查詢 != , < , > , <= , >= 否則 不會(huì)命中索引。
2.禁止無(wú)邊界范圍查詢 NOT IN , 否則不會(huì)命中索引
3.禁止左模糊或全模糊查詢,否則不會(huì)命中索引
4.字段的默認(rèn)值不要為null,否則不會(huì)命中索引(使用默認(rèn)約束Default Counstraint)填充數(shù)據(jù)默認(rèn)值
5.在字段上計(jì)算后,不會(huì)命中索引
6.組合索引的最左前綴原則
7.關(guān)于number類型的字段不加單引號(hào)也會(huì)走索引
8.對(duì)于多表 JOIN 時(shí)的 ON 條件中 字段類型一定要一致,否則也不會(huì)命中索引
9.varchar 查詢性能比 bigint 好,因?yàn)閎igint類型字段上會(huì)全表掃描,而在varchar上每個(gè)字符判斷會(huì)走索引,這樣避免全表掃描。
10.小數(shù)類型使用decimal,禁止使用float與double float和double存儲(chǔ)數(shù)據(jù)時(shí),可能或損失精度,進(jìn)而判斷的時(shí)候?qū)е陆Y(jié)果不準(zhǔn),強(qiáng)制使用decimal數(shù)據(jù)類型。
11.表達(dá)是否的概念時(shí),字段使用is_開(kāi)頭,數(shù)據(jù)類型使用unsigned tinyint類型, 1表示是 0 表示否。
12.任何非負(fù)數(shù)都必須聲明為unsigned類型 比如年齡。狀態(tài)嗎等,這樣最大容量正值會(huì)擴(kuò)大一倍。
13.如果存儲(chǔ)的字符串長(zhǎng)度幾乎相等,必須使用char定長(zhǎng)字符串類型 比如手機(jī)號(hào)碼11位。
14.有時(shí)候是不需要建索引 性別字段,狀態(tài),這種不同值很少的字段是不需要建立索引的。
15.單表行數(shù)超過(guò)500萬(wàn)行或單表容量超過(guò)2G,才推薦分表
16.進(jìn)行update或delete時(shí),必先select,避免出現(xiàn)誤刪數(shù)據(jù)
數(shù)據(jù)庫(kù)拆分
數(shù)據(jù)庫(kù)承載的數(shù)據(jù)以及請(qǐng)求負(fù)載較高時(shí),我們就要考慮使用讀寫(xiě)分離、數(shù)據(jù)緩存。但隨著業(yè)務(wù)的增長(zhǎng),數(shù)據(jù)庫(kù)的壓力達(dá)到了承載的閥值米就要考慮分庫(kù)分表,分解,分?jǐn)倖蝹€(gè)數(shù)據(jù)庫(kù)壓力。
垂直拆分
數(shù)據(jù)庫(kù)的垂直拆分:通常將所有的數(shù)據(jù)按照不同的業(yè)務(wù)建立并存儲(chǔ)不同的表(table),垂直拆分是按照業(yè)務(wù)將一個(gè)數(shù)據(jù)庫(kù)拆分多個(gè)數(shù)據(jù)庫(kù)。原來(lái)每個(gè)業(yè)務(wù)對(duì)應(yīng)一張表,垂直拆分后,是一個(gè)業(yè)務(wù)對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)(當(dāng)然也有坑可能是多個(gè)業(yè)務(wù)對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù))。其核心是專庫(kù)專用。達(dá)到的結(jié)果是將原來(lái)一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)的壓力按照業(yè)務(wù)均攤到各個(gè)拆分后的數(shù)據(jù)庫(kù)中。垂直拆分也是比較推薦的一種拆分方式。
垂直分片往往需要對(duì)架構(gòu)和設(shè)計(jì)進(jìn)行調(diào)整。在當(dāng)前微服務(wù)化的進(jìn)程中,對(duì)數(shù)據(jù)庫(kù)的垂直拆分是非常友好的。
數(shù)據(jù)表的垂直拆分:?jiǎn)伪淼臄?shù)據(jù)達(dá)到2GB或者500萬(wàn)行記錄就要考慮拆分?jǐn)?shù)據(jù)表,垂直拆分表就將熱點(diǎn)列和不經(jīng)常使用的列表拆分開(kāi),降低單表的大小。
水平拆分
當(dāng)一般垂直拆分遇到瓶頸時(shí),會(huì)對(duì)數(shù)據(jù)表進(jìn)行水平拆分。這種方式與垂直拆分不同的地方是,他不會(huì)更改表結(jié)構(gòu)。水平分表是將一個(gè)表拆分成多結(jié)構(gòu)相同的多個(gè)表;并且這些表分布在不同的數(shù)據(jù)庫(kù)。
分庫(kù)分表中間件有兩種 1.代理模式的分庫(kù)分表中間件:MyCat; 2.客戶端模式的分庫(kù)分表中間件:ShardingJDBC 3.支持事務(wù)的分布式數(shù)據(jù)庫(kù)(當(dāng)然ShardingProxy也是代理分庫(kù)分表中間件)
總結(jié): 結(jié)合著微服務(wù)體系,一般會(huì)進(jìn)行垂直拆分。當(dāng)微服務(wù)中的數(shù)據(jù)庫(kù)出現(xiàn)壓力時(shí),然后進(jìn)行水平拆分。
歡迎大家評(píng)論留言。