分庫分表是怎么分的?
分庫分表主要是有水平拆分和垂直拆分,具體又分為分庫和分表:
水平拆分
水平拆分又包含水平分庫和水平分表。
水平分庫:
- 水平分庫指的就是把把一個(gè)表中的數(shù)據(jù)根據(jù)分片策略分派到不同服務(wù)器上,每個(gè)庫存儲部分?jǐn)?shù)據(jù),所以庫的數(shù)據(jù)之和才是全量數(shù)據(jù)。簡單來說就是把數(shù)據(jù)進(jìn)行拆分,一個(gè)地方放一點(diǎn)數(shù)據(jù)。水平分庫的策略有很多,例如可以根據(jù)id進(jìn)行范圍分片,或者取模分片,或者枚舉分片,日期分片或者自然月分片等等,水平分庫用得很多。
- 適用場景:
- 單庫數(shù)據(jù)量過大,磁盤或性能達(dá)到瓶頸。
- 高并發(fā)讀寫,需分散壓力。
- 優(yōu)點(diǎn):
- 數(shù)據(jù)分散存儲,降低單庫負(fù)載。
- 支持水平擴(kuò)展,提升并發(fā)能力。
- 缺點(diǎn):
- 跨庫查詢需聚合結(jié)果,復(fù)雜度高。
- 分布式事務(wù)處理復(fù)雜。
- 適用場景:
水平分表:
- 水平分表指的是把一個(gè)表中的數(shù)據(jù)拆分到幾個(gè)表中,比如【1<id<=100萬】的數(shù)據(jù)分到table1,【100萬<id<=200萬】的數(shù)據(jù)分到table2,【200萬<id<=300萬】的數(shù)據(jù)分到table3,所有表合起來的數(shù)據(jù)才是完整的全量數(shù)據(jù)。
- 適用場景:
- 單表數(shù)據(jù)量過大,影響查詢效率。
- 無需跨庫事務(wù),但需分散單表壓力。
- 優(yōu)點(diǎn):
- 減少單表數(shù)據(jù)量,提升查詢性能。
- 避免單表鎖競爭。
- 缺點(diǎn):
- 需修改 SQL 語句指定表名(如
table${id%4}
)。 - 分表后仍需處理單庫性能瓶頸。
- 需修改 SQL 語句指定表名(如
- 適用場景:
垂直拆分
垂直拆分又包含垂直分庫和垂直分表。
垂直分庫:
- 垂直分庫是按業(yè)務(wù)把數(shù)據(jù)庫中的表拆分到不同的庫當(dāng)中,比如有10個(gè)表,其中需要分到3個(gè)服務(wù)器上,可以根據(jù)業(yè)務(wù)把4個(gè)表分到服務(wù)器1上,3個(gè)分到服務(wù)器2上,另外3個(gè)分到服務(wù)器3上。注意,這里并不是說垂直分庫就是要平均分的意思,而是要盡可能根據(jù)業(yè)務(wù)進(jìn)行均衡的分片,把數(shù)據(jù)均衡分配到多臺服務(wù)器上。
- 適用場景:
- 業(yè)務(wù)模塊耦合度低,需獨(dú)立管理。
- 不同業(yè)務(wù)數(shù)據(jù)量差異大,需資源隔離。
- 優(yōu)點(diǎn):
- 業(yè)務(wù)解耦,提升系統(tǒng)可維護(hù)性。
- 按業(yè)務(wù)分配資源,優(yōu)化硬件使用。
- 缺點(diǎn):
- 跨庫 JOIN 需應(yīng)用層處理。
- 分布式事務(wù)管理復(fù)雜。
- 適用場景:
垂直分表:
- 垂直分表就是把一個(gè)表里的字段進(jìn)行拆分,例如一個(gè)表很龐大,有100個(gè)字段,這時(shí)候可以考慮把其中一部分字段拿出來新建一個(gè)表,通過id進(jìn)行關(guān)聯(lián)即可,一般是把高頻訪問的字段和低頻字段分開,提高查詢效率。
- 適用場景:
- 單表字段過多,存在大字段(如 BLOB、TEXT)。
- 高頻查詢僅需部分字段。
- 優(yōu)點(diǎn):
- 減少單表寬度,提升查詢效率。
- 分離冷熱數(shù)據(jù),優(yōu)化存儲。
- 缺點(diǎn):
- 查詢需多次 JOIN 或應(yīng)用層合并數(shù)據(jù)。
- 事務(wù)一致性需額外處理。
- 適用場景:
四者的核心區(qū)別對比
拆分層次 | 庫級別 | 表級別 | 庫級別 | 表級別 |
拆分方式 | 按行分布到不同庫 | 按行分布到同庫不同表 | 按業(yè)務(wù)模塊分布到不同庫 | 按字段分布到不同表 |
主要目標(biāo) | 解決單庫容量和性能瓶頸 | 解決單表數(shù)據(jù)量過大問題 | 業(yè)務(wù)解耦與資源隔離 | 優(yōu)化單表結(jié)構(gòu),提升查詢效率 |
數(shù)據(jù)分布 | 數(shù)據(jù)行分散到多個(gè)庫 | 數(shù)據(jù)行分散到多個(gè)表 | 不同表分散到多個(gè)庫 | 表字段分散到多個(gè)表 |
典型場景 | 高并發(fā)電商訂單表 | 用戶表按ID哈希分表 | 用戶、訂單、商品獨(dú)立成庫 | 用戶基礎(chǔ)信息與詳情分離 |
事務(wù)處理 | 跨庫事務(wù)復(fù)雜 | 單庫事務(wù)簡單 | 跨庫事務(wù)復(fù)雜 | 單庫事務(wù)簡單 |
查詢影響 | 跨庫查詢需聚合 | 需路由到具體表 | 跨庫 JOIN 困難 | 需多次查詢或 JOIN |
擴(kuò)展性 | 支持動(dòng)態(tài)擴(kuò)容 | 庫內(nèi)擴(kuò)展有限 | 按業(yè)務(wù)擴(kuò)展庫 | 表結(jié)構(gòu)固定,擴(kuò)展性低 |