1. 切分
一般情況下說的水平切分、垂直切分,都是指的數據庫層面。
隨着業務量的增加,數據量肯定快速增長,拿MySQL來說,單表數據量在百萬級內存讀取效率還是可以的,可以一旦達到千萬級,性能會有較大的降低。如果是復雜的查詢操作,那么組合索引對於內存來說也是一筆很大的開銷。這個時候就需要從數據庫層面來進行優化了。
普遍采用的方式就是數據庫 垂直拆分 + 水平拆分的方式來進行改造。
1.1 垂直拆分
數據庫的垂直拆分: 對業務表進行分類,不同的業務表划分到不同的數據庫里。這種形式的拆分往往是便隨着服務化改造,按功能模塊將原來強耦合的系統拆分為多個弱耦合的服務,此時往往就會進行數據庫的垂直拆分。
數據表的垂直拆分: 是針對於數據表列的拆分,把一張列比較多的表拆分為多張表。比如可以將
垂直拆分的優點:
- 數據庫的拆分簡單明了,拆分規則明確。
- 應用程序模塊清晰明確,整合容易。
- 數據維護方便易行,容易定位。
垂直拆分的缺點:
- 部分表關聯無法在數據庫級別完成,需要在程序中完成。
- 單表大數據量仍然存在性能瓶頸。
- 事務處理相對更為復雜。
- 拆分達到一定程度之后,擴展性會遇到限制。
水平拆分
水平拆分:分庫分表,把一個表的數據按照某種規則化分到不同表或數據庫里。(水平拆分 是按照行數據拆分)。 拆分規則:取模、年份等。
水平拆分的優點:
- 解決單表單庫大數據量和高熱點訪問性能遇到瓶頸的問題;
- 應用程序端整體架構改動相對較少。
- 事務處理相對簡單。
- 只要切分規則能夠定義好,基本上較難遇到擴展性限制。
水平拆分缺點:
- 拆分規則相對更復雜,很難抽象出一個能夠滿足整個數據庫的切分規則。
- 后期數據的維護難度有所增加,人為手工定位數據更困難。
- 產品邏輯將變復雜。比如按年來進行歷史數據歸檔拆分,這個時候在頁面設計上就需要約束用戶必須要先選擇年,然后才能進行查詢。
總而言之:
- 數據表垂直拆分: 單表復雜度。
- 數據庫垂直拆分: 功能拆分。
- 水平拆分:分表:解決單表大數據量問題。 分庫:為了解決單庫性能問題。
https://www.cnblogs.com/beyondbit/p/6973199.html
https://www.cnblogs.com/happyday56/p/3862804.html
http://blog.csdn.net/mchdba/article/details/46278687