1.優先考慮緩存降低對數據庫的讀操作。
2.再考慮讀寫分離,降低數據庫寫操作。
3.最后開始數據拆分,切分模式: 首先垂直(縱向)拆分、再次水平拆分。
4.首先考慮按照業務垂直拆分。
5.再考慮水平拆分:先分庫(設置數據路由規則,把數據分配到不同的庫中)
6.最后再考慮分表,單表拆分到數據1000萬以內。
拆分原則:
1.盡量不拆分 ,架構師進化而來,不是一蹴而就。(SOA)
2.最大可能的找到合適的切分維度。
3.由於數據庫中間件對數據join實現的優劣難以把握,而且實現高性能難度極大,
業務讀取盡量少使用多表的Join-盡量通過數據冗余,分組避免數據跨庫多表Join。
4.盡量避免分布式事物。
5.單表拆分到數據1000萬以內。
背景-緣由:
當數據庫的數據量非常大時,水平拆分和垂直拆分是兩種常見的降低數據庫大小,提升性能的方法。
垂直拆分:列的拆分
專庫專用:一個數據庫由很多表的構成,每個表對應不同的業務,垂直拆分是指按照業務將表進行分類,分布到不同的數據庫上面,這樣也就將數據或者說壓力分擔到不同的庫上面;
特點:
將一個屬性較多,一行數據較大的表,將不同的屬性拆分到不同的表中。
(1)每個庫(表)的結構都不一樣。
(2)一般來說。每個庫(表)的屬性至少有一列交集,一般是主鍵。
(3)所有庫(表)的並集是全量數據。
優點:
1.拆分后業務清晰,拆分規則明確。
2.系統之間整合或者擴展容易。
3.數據維護簡單。
缺點:
1.部分業務表無法join。只能通過接口方式解決,提高了系統復雜度。
2.受每種業務不同的限制存在單庫性能瓶頸,不易數據擴展跟性能提高。
3.事務處理復雜。
垂直拆分的依據: (當一個表屬性很多)
(1)將長度較短,訪問頻率較高的屬性盡量放到一個表里,這個表暫且成為主表。---優先考慮
(2)將字段較長,訪問頻率較低的屬性盡量放在一張表里,這個表暫且成為擴展表。---優先考慮
(3)經常一起訪問的屬性也放到一張表里面。--如果1和2都滿足,可以考慮第三點,非必須。
為什么這樣拆分的原因:
為何要將字段短,訪問頻率高的屬性放在一個表內?為什么這么垂直拆分可以提升性能?因為:
(1)數據庫有自己的內存緩存buffer,會將磁盤上的數據下載load到內存緩存buffer里(暫且理解為進程內緩存吧)
(2)內存buffer緩存數據是以行row為單位的。
(3)在內存有限的情況下,在數據庫內存buffer里緩存短長度的數據行row,就能緩存更多的數據。
(4)在數據內存buffer里緩存訪問頻率高的row,就能提升緩存命中率,減少磁盤的訪問。
注意點:
服務層訪問數據庫的主表和副表屬性時,服務層不要使用Join來連表訪問,而應該分兩次進行查詢。
原因:大數據高並發互聯網場景下,一般來說。吞吐量和擴展性是主要矛盾:
(1)join更消耗數據庫性能
(2)join會讓主表和擴展表耦合在一起(必須在一個數據庫實例上),不利於數據量大時拆分到不同的數據庫實例上(機器上),畢竟減少數據量,提升性能才是垂直拆分的初衷。
水平拆分:行的拆分
垂直拆分后遇到單機瓶頸,相對於垂直拆分的區別是:
垂直拆分是把不同的表拆到不同的數據庫中,而水平拆分是把同一張表拆到不同的數據庫中。
我們可以將數據的水平切分理解為:我們將數據的水平切分理解為按照數據行的切分,
就是講表中的某些行切分到一個數據庫,而另外的某些行后切分到其他的數據庫中,主要有分表,分庫兩種模式;
特點:
以某個字段為依據(例如uid),按照一定規則(例如取模),將一個庫(表)上的數據拆分到多個庫(表)上。
(1)每個庫(表)的結構都一樣。
(2)每個庫(表)的數據都不一樣,沒有交集。
(3)所有庫(表)的並集全量數據。
優點:
1.不存在單庫大數據,高並發的性能瓶頸;
2.對應用透明,應用端改造較少。
3.按照合理拆分規則拆分,join操作基本避免跨庫。
4.提高了系統的穩定性跟負載能力。
缺點:
1.拆分規則難以抽象。
2.分片事務一致性難以解決。
3.數據多次擴展難度跟維護量極大。
4.跨庫join性能較差。
拆分的處理難點:
兩種方式的共同缺點:
1.引入分布式事物的問題。
2.跨節點join的問題。
3.跨節點合並排序分頁問題。
針對數據源管理,目前主要有兩種思路:
A:客戶端模式,在每個應用程序模塊中配置管理自己需要的一個(或者多個)數據源,
直接訪問各個數據庫,在模塊內完成數據的整合。
優點:相對簡單,無性能損耗。
缺點:不夠通用,數據庫連接的處理復雜,對業務不夠透明,處理復雜。
B:通過中間代理層來統一管理所有的數據源,后端數據庫集群對前端應用程序透明;
優點:通用,對應用透明,改造少。
缺點::實現難度大,有二次轉發性能損失:
拆分原則:
1.盡量不拆分 ,架構師進化而來,不是一蹴而就。(SOA)
2.最大可能的找到合適的切分維度。
3.由於數據庫中間件對數據join實現的優劣難以把握,而且實現高性能難度極大,
業務讀取盡量少使用多表的Join-盡量通過數據冗余,分組避免數據跨庫多表Join。
4.盡量避免分布式事物。
5.單表拆分到數據1000萬以內。
切分方案
范圍,枚舉,時間,取模,哈希,制定等。
