1.什么是分庫分表
一個(gè)庫一個(gè)表 拆分為 N個(gè)庫N個(gè)表
分為垂直拆分颤专,水平拆分
2.為什么要分庫分表
隨著業(yè)務(wù)發(fā)展撵术,表的數(shù)量,以及單表數(shù)據(jù)量越來越大卒落,而由于無法分布式部署(部分?jǐn)?shù)據(jù)庫支持)羡铲,單臺服務(wù)器資源(cpu 內(nèi)存,IO)的限制,導(dǎo)致數(shù)據(jù)操作開銷大导绷,查詢慢犀勒,因此需要進(jìn)行分庫分表,提高數(shù)據(jù)查詢速度妥曲。
常見優(yōu)化策略:
更換數(shù)據(jù)庫(緩存)
SQL 索引 字段 優(yōu)化
分區(qū)
讀寫分離
分庫分表
3.讀寫分離
master-slave模式贾费,mastr負(fù)責(zé)更新操作,slave負(fù)責(zé)查詢操作檐盟。
4.分庫分表常見方式
垂直拆分:
(根據(jù)字段拆分)
垂直分庫:
按照業(yè)務(wù)劃分褂萧,將不同業(yè)務(wù)數(shù)據(jù)單獨(dú)拆分成一個(gè)庫】“微服務(wù)治理”做法類似导犹,每個(gè)微服務(wù)單獨(dú)使用一個(gè)庫。
垂直分表
如果單表字段過多羡忘,可以通過"大表拆小表"方式將不常用或者字段長度較大的表
拆分到擴(kuò)展表中谎痢,mysql是按照數(shù)據(jù)頁進(jìn)行存儲(chǔ)的,如果單行數(shù)據(jù)過大卷雕,會(huì)導(dǎo)致數(shù)據(jù)跨頁节猿,造成額外的性能開銷。
垂直拆分優(yōu)點(diǎn):
- 業(yè)務(wù)系統(tǒng)解耦。
- 與微服務(wù)治理類似滨嘱,便于集中管理峰鄙,監(jiān)控,擴(kuò)展
- 高并發(fā)情況下提升IO太雨,數(shù)據(jù)庫連接數(shù)吟榴,單機(jī)硬件資源瓶頸
垂直拆分缺點(diǎn):
- 多表join只能通過應(yīng)用程序解決,加大開發(fā)復(fù)雜度
- 分布式事務(wù)處理復(fù)雜
- 單表數(shù)據(jù)總量無法解決(水平切分處理)
水平拆分
將一個(gè)表中的數(shù)據(jù)以某一個(gè)字段(取模)囊扳,拆分到多個(gè)表中(根據(jù)內(nèi)容拆分)
水平拆分的優(yōu)點(diǎn):
- 使單表的數(shù)量保持在一定數(shù)量吩翻,提高查詢性能
- 切分后表結(jié)構(gòu)相同,程序改動(dòng)小
水平拆分的缺點(diǎn):
- 數(shù)據(jù)擴(kuò)容
- 分片規(guī)則難以抽象(不同的庫宪拥,難以固定某個(gè)字段拆分仿野,比如商品可以商品IDhash到某個(gè)庫中,訂單表需要根據(jù)用戶IDhash到某個(gè)庫中)
- 分布式事務(wù)她君,部分業(yè)務(wù)無法關(guān)聯(lián)join
5.分庫分表帶來的問題
- 分布式事務(wù)
- 表join
-分布式全局唯一Id(twitter開源的 snowFlake)
6.分庫分表算法
取模
通過 某一個(gè)字段進(jìn)行hash userId%3 =1 則分配到1庫脚作。可以使數(shù)據(jù)均勻分布缔刹,避免數(shù)據(jù)熱點(diǎn)問題球涛。數(shù)據(jù)擴(kuò)容是明顯的缺點(diǎn),可以采用 一致性hash 算法
范圍
比如按月 按省分配
預(yù)定義
1億數(shù)據(jù) 每個(gè)庫存100萬數(shù)據(jù)校镐,可以預(yù)先創(chuàng)建10個(gè)庫亿扁。
7.常用的中間件
分為兩種類型:
Proxy代理:
mycat(重)、mysql-proxy atlas鸟廓、sharding-proxy(sharding-sphere )
jdbc直連:
TDDL(淘寶 半開源) 从祝、sharding-jdbc(sharding-sphere )