W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
當(dāng)數(shù)據(jù)庫(kù)的數(shù)據(jù)量非常大時(shí),水平切分和垂直拆分是兩種常見(jiàn)的降低數(shù)據(jù)庫(kù)大小,提升性能的方法。假設(shè)有用戶(hù)表:
user(…);
水平切分是指,以某個(gè)字段為依據(jù)(例如uid),按照一定規(guī)則(例如取模),將一個(gè)庫(kù)(表)上的數(shù)據(jù)拆分到多個(gè)庫(kù)(表)上,以降低單庫(kù)(表)大小,達(dá)到提升性能的目的的方法,水平切分后,各個(gè)庫(kù)(表)的特點(diǎn)是:
(1)每個(gè)庫(kù)(表)的結(jié)構(gòu)都一樣
(2)每個(gè)庫(kù)(表)的數(shù)據(jù)都不一樣,沒(méi)有交集
(3)所有庫(kù)(表)的并集是全量數(shù)據(jù)
垂直拆分是指,將一個(gè)屬性較多,一行數(shù)據(jù)較大的表,將不同的屬性拆分到不同的表中,以降低單庫(kù)(表)大小,達(dá)到提升性能的目的的方法,垂直切分后,各個(gè)庫(kù)(表)的特點(diǎn)是:
(1)每個(gè)庫(kù)(表)的結(jié)構(gòu)都不一樣
(2)一般來(lái)說(shuō),每個(gè)庫(kù)(表)的屬性至少有一列交集,一般是主鍵
(3)所有庫(kù)(表)的并集是全量數(shù)據(jù)
還是以上文提到的用戶(hù)表為例,如果要垂直拆分,可能拆分結(jié)果會(huì)是這樣的:
user_base(當(dāng)一個(gè)表屬性很多時(shí),如何來(lái)進(jìn)行垂直拆分呢?如果沒(méi)有特殊情況,拆分依據(jù)主要有幾點(diǎn):
(1)將長(zhǎng)度較短,訪(fǎng)問(wèn)頻率較高的屬性盡量放在一個(gè)表里,這個(gè)表暫且稱(chēng)為主表
(2)將字段較長(zhǎng),訪(fǎng)問(wèn)頻率較低的屬性盡量放在一個(gè)表里,這個(gè)表暫且稱(chēng)為擴(kuò)展表
如果1和2都滿(mǎn)足,還可以考慮第三點(diǎn):
(3)經(jīng)常一起訪(fǎng)問(wèn)的屬性,也可以放在一個(gè)表里
優(yōu)先考慮1和2,第3點(diǎn)不是必須。另,如果實(shí)在屬性過(guò)多,主表和擴(kuò)展表都可以有多個(gè)。
原因是,大數(shù)據(jù)高并發(fā)互聯(lián)網(wǎng)場(chǎng)景下,一般來(lái)說(shuō),吞吐量和擴(kuò)展性是主要矛盾:
(1)join更消損耗數(shù)據(jù)庫(kù)性能
(2)join會(huì)讓base表和ext表耦合在一起(必須在一個(gè)數(shù)據(jù)庫(kù)實(shí)例上),不利于數(shù)據(jù)量大時(shí)拆分到不同的數(shù)據(jù)庫(kù)實(shí)例上(機(jī)器上)。畢竟減少數(shù)據(jù)量,提升性能才是垂直拆分的初衷。
為何要將字段短,訪(fǎng)問(wèn)頻率高的屬性放到一個(gè)表內(nèi)?為何這么垂直拆分可以提升性能?因?yàn)椋?/p>
(1)數(shù)據(jù)庫(kù)有自己的內(nèi)存buffer,會(huì)將磁盤(pán)上的數(shù)據(jù)load到內(nèi)存buffer里(暫且理解為進(jìn)程內(nèi)緩存吧)
(2)內(nèi)存buffer緩存數(shù)據(jù)是以row為單位的
(3)在內(nèi)存有限的情況下,在數(shù)據(jù)庫(kù)內(nèi)存buffer里緩存短row,就能緩存更多的數(shù)據(jù)
(4)在數(shù)據(jù)庫(kù)內(nèi)存buffer里緩存訪(fǎng)問(wèn)頻率高的row,就能提升緩存命中率,減少磁盤(pán)的訪(fǎng)問(wèn)
舉個(gè)例子就很好理解了:
假設(shè)數(shù)據(jù)庫(kù)內(nèi)存buffer為1G,未拆分的user表1行數(shù)據(jù)大小為1k,那么只能緩存100w行數(shù)據(jù)。
如果垂直拆分成user_base和user_ext,其中:
(1)user_base訪(fǎng)問(wèn)頻率高(例如uid, name, passwd, 以及一些flag等),一行大小為0.1k
(2)user_ext訪(fǎng)問(wèn)頻率低(例如簽名, 個(gè)人介紹等),一行大小為0.9k
那邊內(nèi)存buffer就就能緩存近乎1000w行user_base的記錄,訪(fǎng)問(wèn)磁盤(pán)的概率會(huì)大大降低,數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的時(shí)延會(huì)大大降低,吞吐量會(huì)大大增加。
(1)水平拆分和垂直拆分都是降低數(shù)據(jù)量大小,提升數(shù)據(jù)庫(kù)性能的常見(jiàn)手段
(2)流量大,數(shù)據(jù)量大時(shí),數(shù)據(jù)訪(fǎng)問(wèn)要有service層,并且service層不要通過(guò)join來(lái)獲取主表和擴(kuò)展表的屬性
(3)垂直拆分的依據(jù),盡量把長(zhǎng)度較短,訪(fǎng)問(wèn)頻率較高的屬性放在主表里
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: