自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分庫(kù)分表常見(jiàn)算法,你學(xué)會(huì)了嗎?

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
分庫(kù)分表是一種數(shù)據(jù)庫(kù)設(shè)計(jì)技術(shù),其目的是為了提高數(shù)據(jù)庫(kù)的性能和擴(kuò)展性。它通過(guò)將數(shù)據(jù)庫(kù)的表拆分到多個(gè)數(shù)據(jù)庫(kù)中來(lái)實(shí)現(xiàn)這一目的。

分庫(kù)分表常見(jiàn)算法

分庫(kù)分表分片策略選擇,主要考慮兩個(gè)原則:

  1. 當(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ù)分表。
  2. 既然已經(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)的一種路由方式。


public class ModTest {
public static void main(String[] args){
// 數(shù)量
int num = 3;
String key = UUID.randomUUID().toString();
// hash值:返回一個(gè)數(shù)的絕對(duì)值
long hash = Math.abs((long) key.hashCode());
System.out.println(hash % num);
}
}

優(yōu)點(diǎn):

  1. 數(shù)據(jù)均衡:哈希拆分可以將數(shù)據(jù)均衡地分布在不同的表中,避免某一個(gè)表數(shù)據(jù)量過(guò)大,從而導(dǎo)致性能問(wèn)題。
  2. 橫向擴(kuò)展:當(dāng)數(shù)據(jù)量增長(zhǎng)時(shí),可以通過(guò)增加新的表來(lái)進(jìn)行橫向擴(kuò)展,而不需要進(jìn)行縱向擴(kuò)展。

缺點(diǎn):

  1. 就是擴(kuò)容麻煩,需要重新計(jì)算每一行數(shù)據(jù)對(duì)應(yīng)的哈希值。
  2. 不適用于歸檔:哈希拆分沒(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):

  1. 方便進(jìn)行橫向擴(kuò)展:當(dāng)數(shù)據(jù)量增長(zhǎng)時(shí),可以通過(guò)增加新的表來(lái)進(jìn)行橫向擴(kuò)展,而不需要進(jìn)行縱向擴(kuò)展。
  2. 規(guī)則簡(jiǎn)單,容易理解。
  3. 歷史數(shù)據(jù)可以進(jìn)行單獨(dú)的歸檔。

缺點(diǎn):

  1. 數(shù)據(jù)傾斜,數(shù)據(jù)熱點(diǎn)可能存在于某個(gè)范圍或者時(shí)間段中,數(shù)據(jù)庫(kù)壓力分?jǐn)偛痪鶆?/span>

范圍 + 取模算法

將范圍拆分和取模算法結(jié)合起來(lái)使用。

  1. 將數(shù)據(jù)按照范圍放到不同的數(shù)據(jù)庫(kù)中。
  2. 取模運(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)慎考慮。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2024-09-09 12:00:34

2024-08-30 14:34:00

2022-03-08 08:39:22

gRPC協(xié)議云原生

2023-06-27 07:21:51

前端開(kāi)發(fā)坑點(diǎn)

2023-09-12 07:26:46

2024-03-28 12:20:17

2024-01-02 12:05:26

Java并發(fā)編程

2023-08-01 12:51:18

WebGPT機(jī)器學(xué)習(xí)模型

2023-01-10 08:43:15

定義DDD架構(gòu)

2024-02-04 00:00:00

Effect數(shù)據(jù)組件

2023-07-26 13:11:21

ChatGPT平臺(tái)工具

2024-01-19 08:25:38

死鎖Java通信

2024-07-10 08:15:40

2023-02-15 08:41:56

多層維表性能寬表

2022-06-16 07:50:35

數(shù)據(jù)結(jié)構(gòu)鏈表

2022-12-06 07:53:33

MySQL索引B+樹(shù)

2023-07-30 22:29:51

BDDMockitoAssert測(cè)試

2023-10-06 14:49:21

SentinelHystrixtimeout

2024-02-02 11:03:11

React數(shù)據(jù)Ref

2024-03-06 08:28:16

設(shè)計(jì)模式Java
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)