前言
做數據庫分表的時候,總是能看到水平切分、垂直切分,但是並不能理解何為水平、何為垂直。僅此做個記錄。
1.切分
一般情況下說的水平切分、垂直切分,都是指的數據庫層面的。
隨着業務量的增加,數據量肯定快速增長,拿Mysql來說,單表數據量在百萬級內讀取效率還是可以的,可是一旦達到千萬級,性能會有較大的降低。如果是復雜的搜索,那么組合索引對於內存來說也是一筆很大的開銷。這個時候就需要從數據庫層面來進行優化了。
普遍采用的方式就是數據庫 垂直切分+ 水平切分的方式來進行改進。
1.1垂直切分
垂直拆分:原來一個表的信息,拆分到兩個或者多個表中,通過主鍵來進行關聯。(垂直拆分列,列數據拆分到不同表中)
垂直切分的優點
- 數據庫的拆分簡單明了,拆分規則明確;
- 應用程序模塊清晰明確,整合容易;
- 數據維護方便易行,容易定位;
垂直切分的缺點
- 部分表關聯無法在數據庫級別完成,需要在程序中完成;
- 單表大數據量仍然存在性能瓶頸;
- 事務處理相對更為復雜;
- 切分達到一定程度之后,擴展性會遇到限制;
1.2水平切分
水平切分:把一個表的數據按照某種規則划分到不同表或數據庫里。(水平拆分行,行數據拆分到不同表中)
水平切分的優點
- 解決單表大數據量性能遇到瓶頸的問題;
- 應用程序端整體架構改動相對較少;
- 事務處理相對簡單;
- 只要切分規則能夠定義好,基本上較難遇到擴展性限制;
水平切分的缺點
- 切分規則相對更為復雜,很難抽象出一個能夠滿足整個數據庫的切分規則;
- 后期數據的維護難度有所增加,人為手工定位數據更困難;
- 應用系統各模塊耦合度較高,可能會對后面數據的遷移拆分造成一定的困難。
2.擴展
一般情況下說的水平擴展、垂直擴展,都是指的服務層面的。
當一個開發人員提升計算機系統負荷時,通常會考慮兩種方式垂直擴展和水平擴展。選用哪種策略主要依賴於要解決的問題 以及系統資源的限制。
2.1垂直擴展
在垂直擴展模型中,想要增加系統負荷就意味着要在系統現有的部件上下工夫,即通過提高系統部件的能力來實現。
比如增加機器的內存,提高單機處理能力,拆分功能到不同的機器上部署等等。
垂直擴展旨在提高自身效率,但總會遇到自身的瓶頸。
2.2水平擴展
在水平擴展模型中,通過增加更多的系統成員來實現。也就是通常所說的加機器。
當你的大量請求並發的時候,可以通過分布式的方式,讓請求均勻的分布到不同的機器上,減小壓力。
總結
簡而言之:
垂直擴展:拆分功能為小功能,來轉移壓力的發生。
水平擴展:復制相同的表、庫、服務器來共同承擔壓力。