【分庫分表】切分方式(水平切分, 垂直切分)

【分庫分表】切分方式 - 簡書
https://www.jianshu.com/p/84fb7c75ab49數據庫

 

【分庫分表】切分方式

這裏介紹設計分庫分表的方案時應該考慮的設計要點,並給出相應的解決方案。設計模式

 

1、關於切分方式

數據庫的切分指的是經過某種特定的條件,將咱們存放在同一個數據庫中的數據分散存放到多個數據庫(主機)中,以達到分散單臺設備負載的效果,即分庫分表。緩存

數據的切分根據其切分規則的類型,能夠分爲 垂直(縱向)切分 和水平(橫向)切分分佈式

  • 垂直(縱向)切分: 把單一的表拆分紅多個表,並分散到不一樣的數據庫(主機)上。
  • 水平(橫向)切分:根據表中數據的邏輯關係,將贊成個表中的數據按照某種條件拆分到多臺數據庫(主機)上。

1. 垂直切分

一個數據庫有多個表構成,每一個表對應不一樣的業務,垂直切分是隻按照業務將表進行分類,將其分佈到不一樣的數據庫上,這樣就將數據分擔到了不一樣的庫上(專庫專用)。性能

案例:
有以下幾張表:設計

  • 用戶信息表(User)
  • 交易記錄(Pay)
  • 商品(Commodity)
    針對以上案例,垂直切分就是根據每一個表的不一樣業務進行切分,好比User表,Pay表和Commodity表,將每一個表切分到不一樣的數據庫上。

垂直切分的優勢以下:orm

  • 拆分後業務清晰,拆分規則明確。
  • 系統之間進行整合或擴展很容易。
  • 按照成本、應用的等級、應用的類型等獎表放到不一樣的機器上,便於管理。
  • 便於實現動靜分離、冷熱分離的數據庫表的設計模式。
  • 數據維護簡單。

垂直切分的缺點以下:對象

  • 部分業務表沒法關聯(Join), 只能經過接口方式解決,提升了系統的複雜度。
  • 受每種業務的不一樣限制,存在單庫性能瓶頸,不易進行數據擴展和提高性能。
  • 事務處理複雜。

垂直切分除了用於分解單庫單表的壓力,也用於實現冷熱分離,也就是根據數據的活躍度進行拆分,由於對擁有不一樣活躍度的數據的處理方式不一樣。排序

咱們可將原本能夠在同一個表中的內容人爲地劃分爲多個表。所謂「原本」,是指按照關係型數據庫第三範式的要求,應該在同一個表中,將其拆分開就叫做反範化(Denormalize)。接口

例如,對配置表的某些字段不多進行修改時,將其放到一個查詢性能較高的數據庫硬件上;對配置表的其餘字段更新頻繁時,則將其放到另外一個更新性能較高的數據庫硬件上。

這裏咱們再舉一個例子:在微博系統的設計中,一個微博對象包括文章標題、做者、分類、建立時間等屬性字段,這些字段的變化頻率低,查詢次數多,叫做冷數據。而博客的瀏覽量、回覆數、點贊數等相似的統計信息,或者別的變化頻率比較高的數據,叫做活躍數據或者熱數據。

咱們把冷熱數據分開存放,就叫做冷熱分離,在MySQL的數據庫中,冷數據查詢較多,更新較少,適合用MyISAM引擎,而熱數據更新比較頻繁,適合使用InnoDB存儲引擎,這也是垂直拆分的一種。

咱們推薦在設計數據庫表結構時,就考慮垂直拆分,根據冷熱分離、動靜分離的原則,再根據使用的存儲引擎的特色,對冷數據可使用MyISAM,能更好地進行數據查詢;對熱數據可使用InnoDB,有更快的更新速度,這樣可以有效提高性能。

其次,對讀多寫少的冷數據可配置更多的從庫來化解大量查詢請求的壓力;對於熱數據,可使用多個主庫構建分庫分表的結構,請參考下面關於水平切分的內容,後續的三四五章提供了不一樣的分庫分表的具體實施方案。

注意,對於一些特殊的活躍數據或者熱點數據,也能夠考慮使用Memcache、Redis之類的緩存,等累計到必定的量後再更新數據庫,例如,在記錄微博點贊數量的業務中,點贊數量被存儲在緩存中,每增長1000個點贊,才寫一次數據。

2. 水平切分

與垂直切分對比,水平切分不是將表進行分類,而是將其按照某個字段的某種規則分散到多個庫中,在每一個表中包含一部分數據,全部表加起來就是全量的數據。

簡單來講,咱們能夠將對數據的水平切分理解爲按照數據行進行切分,就是將表中的某些行切分到一個數據庫表中,而將其餘行切分到其餘數據庫表中。

這種切分方式根據單表的數據量的規模來切分,保證單表的容量不會太大,從而保證了單表的查詢等處理能力,例如將用戶的信息表拆分紅User一、User2等,表結構是徹底同樣的。咱們一般根據某些特定的規則來劃分表,好比根據用戶的ID來取模劃分。

例如,在博客系統中,當讀取博客的量很大時,就應該採起水平切分來減小每一個單表的壓力,並提高性能。

以微博表爲例,當同時有100萬個用戶在瀏覽時,若是是單表,則單表會進行100萬次請求,假如是單庫,數據庫就會承受100萬次的請求壓力;假如將其分爲100個表,而且分佈在10個數據庫中,每一個表進行1萬次請求,則每一個數據庫會承受10萬次的請求壓力,雖然這不可能絕對平均,可是能夠說明問題,這樣壓力就減小了不少,而且是成倍減小的。

水平切分的優勢以下:

  • 單庫單表的數據保持在必定的量級,有助於性能的提升。
  • 切分的表的結構相同,應用層改造較少,只須要增長路由規則便可。
  • 提升了系統的穩定性和負載能力。

水平切分的缺點以下:

  • 切分後,數據是分散的,很難利用數據庫的Join操做,跨庫Join性能較差。
  • 拆分規則難以抽象。
  • 分片事務的一致性難以解決。
  • 數據擴容的難度和維護量極大。

綜上所述,垂直切分和水平切分的共同點以下:

  • 存在分佈式事務的問題。
  • 存在跨節點Join的問題。
  • 存在跨節點合併排序、分頁的問題。
  • 存在多數據源管理的問題。

在瞭解這兩種切分方式的特色後,咱們就能夠根據本身的業務需求來選擇,一般會同時使用這兩種切分方式,垂直切分更偏向於業務拆分的過程,在技術上咱們更關注水平切分的方案。

PS: 稍候再討論一下水平切分的路由過程和分片維度~~