分庫(kù)分表常見(jiàn)算法,你學(xué)會(huì)了嗎?
分庫(kù)分表常見(jiàn)算法
分庫(kù)分表分片策略選擇,主要考慮兩個(gè)原則:
- 當(dāng)前業(yè)務(wù)是否真的需要分庫(kù)分表,分庫(kù)分表雖然可以減少單庫(kù)單表的數(shù)據(jù)壓力,處于一個(gè)良好的查詢響應(yīng)范圍,但是帶來(lái)的問(wèn)題也比較多,比如事務(wù),數(shù)據(jù)查詢等等,所以我認(rèn)為不到萬(wàn)不得已,不要進(jìn)行分庫(kù)分表。
- 既然已經(jīng)決定了要進(jìn)行分庫(kù)分表,分庫(kù)分表分片策略選擇就比較重要。
哈希取模算法
根據(jù)某一列的哈希值來(lái)拆分表,比如將用戶的 email 按照哈希值來(lái)拆分表,以達(dá)到數(shù)據(jù)分布均勻的目的。hash(字段) mod 數(shù)據(jù)庫(kù)實(shí)例數(shù)或子表數(shù)量,是最為常見(jiàn)的一種路由方式。
優(yōu)點(diǎn):
- 數(shù)據(jù)均衡:哈希拆分可以將數(shù)據(jù)均衡地分布在不同的表中,避免某一個(gè)表數(shù)據(jù)量過(guò)大,從而導(dǎo)致性能問(wèn)題。
- 橫向擴(kuò)展:當(dāng)數(shù)據(jù)量增長(zhǎng)時(shí),可以通過(guò)增加新的表來(lái)進(jìn)行橫向擴(kuò)展,而不需要進(jìn)行縱向擴(kuò)展。
缺點(diǎn):
- 就是擴(kuò)容麻煩,需要重新計(jì)算每一行數(shù)據(jù)對(duì)應(yīng)的哈希值。
- 不適用于歸檔:哈希拆分沒(méi)有考慮時(shí)間因素,因此無(wú)法將歷史數(shù)據(jù)歸檔到單獨(dú)的表中。
容量(時(shí)間)范圍算法
- 按照范圍拆分:根據(jù)某一列的值來(lái)拆分表,比如將 id 從 1 到 1000 的數(shù)據(jù)拆分到第一個(gè)數(shù)據(jù)庫(kù),將 id 從 1001 到 2000 的數(shù)據(jù)拆分到第二個(gè)數(shù)據(jù)庫(kù),依此類推。
- 時(shí)間拆分:根據(jù)時(shí)間來(lái)拆分表,比如將當(dāng)月的數(shù)據(jù)拆分到當(dāng)月的表中,將去年的數(shù)據(jù)拆分到去年的表中,依此類推。
優(yōu)點(diǎn):
- 方便進(jìn)行橫向擴(kuò)展:當(dāng)數(shù)據(jù)量增長(zhǎng)時(shí),可以通過(guò)增加新的表來(lái)進(jìn)行橫向擴(kuò)展,而不需要進(jìn)行縱向擴(kuò)展。
- 規(guī)則簡(jiǎn)單,容易理解。
- 歷史數(shù)據(jù)可以進(jìn)行單獨(dú)的歸檔。
缺點(diǎn):
- 數(shù)據(jù)傾斜,數(shù)據(jù)熱點(diǎn)可能存在于某個(gè)范圍或者時(shí)間段中,數(shù)據(jù)庫(kù)壓力分?jǐn)偛痪鶆?/span>
范圍 + 取模算法
將范圍拆分和取模算法結(jié)合起來(lái)使用。
- 將數(shù)據(jù)按照范圍放到不同的數(shù)據(jù)庫(kù)中。
- 取模運(yùn)算,將數(shù)據(jù)分配到不同的數(shù)據(jù)表中。
總結(jié)
分庫(kù)分表是一種數(shù)據(jù)庫(kù)設(shè)計(jì)技術(shù),其目的是為了提高數(shù)據(jù)庫(kù)的性能和擴(kuò)展性。它通過(guò)將數(shù)據(jù)庫(kù)的表拆分到多個(gè)數(shù)據(jù)庫(kù)中來(lái)實(shí)現(xiàn)這一目的。
要根據(jù)實(shí)際的業(yè)務(wù)情況進(jìn)行組合,例如省、市;男、女;年齡;等等都可以作為策略。
- 增加了系統(tǒng)的復(fù)雜性:分庫(kù)分表會(huì)增加系統(tǒng)的復(fù)雜性,有時(shí)候需要額外的中間件(MyCat)來(lái)實(shí)現(xiàn),并且需要在程序中額外處理分庫(kù)分表的邏輯。分頁(yè)、排序、跨節(jié)點(diǎn)聯(lián)合查詢等等問(wèn)題。
- 降低了事務(wù)的原子性:由于分庫(kù)分表會(huì)將數(shù)據(jù)存儲(chǔ)在多個(gè)數(shù)據(jù)庫(kù)或表中,因此在一次事務(wù)中可能涉及多個(gè)數(shù)據(jù)庫(kù),降低了事務(wù)的原子性。如何解決跨庫(kù)事務(wù)問(wèn)題。
- 對(duì)性能的影響不確定:分庫(kù)分表并不是一定能提高性能,具體的性能提升取決于實(shí)際情況,如果沒(méi)有正確地進(jìn)行分庫(kù)分表,可能會(huì)導(dǎo)致性能下降。
- 需要進(jìn)行數(shù)據(jù)遷移:如果需要擴(kuò)展分庫(kù)分表的范圍,可能需要進(jìn)行數(shù)據(jù)遷移,這會(huì)增加系統(tǒng)的復(fù)雜性和風(fēng)險(xiǎn)。
總之,分庫(kù)分表有一些優(yōu)點(diǎn),但同時(shí)也有一些缺點(diǎn),在實(shí)際應(yīng)用中需要謹(jǐn)慎考慮。