【分庫分表】切分方式 - 簡書
https://www.jianshu.com/p/84fb7c75ab49數據庫
這裏介紹設計分庫分表的方案時應該考慮的設計要點,並給出相應的解決方案。設計模式
數據庫的切分指的是經過某種特定的條件,將咱們存放在同一個數據庫中的數據分散存放到多個數據庫(主機)中,以達到分散單臺設備負載的效果,即分庫分表。緩存
數據的切分根據其切分規則的類型,能夠分爲 垂直(縱向)切分 和水平(橫向)切分。分佈式
一個數據庫有多個表構成,每一個表對應不一樣的業務,垂直切分是隻按照業務將表進行分類,將其分佈到不一樣的數據庫上,這樣就將數據分擔到了不一樣的庫上(專庫專用)。性能
案例:
有以下幾張表:設計
- 用戶信息表(User)
- 交易記錄(Pay)
- 商品(Commodity)
針對以上案例,垂直切分就是根據每一個表的不一樣業務進行切分,好比User表,Pay表和Commodity表,將每一個表切分到不一樣的數據庫上。
垂直切分的優勢以下:orm
垂直切分的缺點以下:對象
垂直切分除了用於分解單庫單表的壓力,也用於實現冷熱分離,也就是根據數據的活躍度進行拆分,由於對擁有不一樣活躍度的數據的處理方式不一樣。排序
咱們可將原本能夠在同一個表中的內容人爲地劃分爲多個表。所謂「原本」,是指按照關係型數據庫第三範式的要求,應該在同一個表中,將其拆分開就叫做反範化(Denormalize)。接口
例如,對配置表的某些字段不多進行修改時,將其放到一個查詢性能較高的數據庫硬件上;對配置表的其餘字段更新頻繁時,則將其放到另外一個更新性能較高的數據庫硬件上。
這裏咱們再舉一個例子:在微博系統的設計中,一個微博對象包括文章標題、做者、分類、建立時間等屬性字段,這些字段的變化頻率低,查詢次數多,叫做冷數據。而博客的瀏覽量、回覆數、點贊數等相似的統計信息,或者別的變化頻率比較高的數據,叫做活躍數據或者熱數據。
咱們把冷熱數據分開存放,就叫做冷熱分離,在MySQL的數據庫中,冷數據查詢較多,更新較少,適合用MyISAM引擎,而熱數據更新比較頻繁,適合使用InnoDB存儲引擎,這也是垂直拆分的一種。
咱們推薦在設計數據庫表結構時,就考慮垂直拆分,根據冷熱分離、動靜分離的原則,再根據使用的存儲引擎的特色,對冷數據可使用MyISAM,能更好地進行數據查詢;對熱數據可使用InnoDB,有更快的更新速度,這樣可以有效提高性能。
其次,對讀多寫少的冷數據可配置更多的從庫來化解大量查詢請求的壓力;對於熱數據,可使用多個主庫構建分庫分表的結構,請參考下面關於水平切分的內容,後續的三四五章提供了不一樣的分庫分表的具體實施方案。
注意,對於一些特殊的活躍數據或者熱點數據,也能夠考慮使用Memcache、Redis之類的緩存,等累計到必定的量後再更新數據庫,例如,在記錄微博點贊數量的業務中,點贊數量被存儲在緩存中,每增長1000個點贊,才寫一次數據。
與垂直切分對比,水平切分不是將表進行分類,而是將其按照某個字段的某種規則分散到多個庫中,在每一個表中包含一部分數據,全部表加起來就是全量的數據。
簡單來講,咱們能夠將對數據的水平切分理解爲按照數據行進行切分,就是將表中的某些行切分到一個數據庫表中,而將其餘行切分到其餘數據庫表中。
這種切分方式根據單表的數據量的規模來切分,保證單表的容量不會太大,從而保證了單表的查詢等處理能力,例如將用戶的信息表拆分紅User一、User2等,表結構是徹底同樣的。咱們一般根據某些特定的規則來劃分表,好比根據用戶的ID來取模劃分。
例如,在博客系統中,當讀取博客的量很大時,就應該採起水平切分來減小每一個單表的壓力,並提高性能。
以微博表爲例,當同時有100萬個用戶在瀏覽時,若是是單表,則單表會進行100萬次請求,假如是單庫,數據庫就會承受100萬次的請求壓力;假如將其分爲100個表,而且分佈在10個數據庫中,每一個表進行1萬次請求,則每一個數據庫會承受10萬次的請求壓力,雖然這不可能絕對平均,可是能夠說明問題,這樣壓力就減小了不少,而且是成倍減小的。
水平切分的優勢以下:
水平切分的缺點以下:
綜上所述,垂直切分和水平切分的共同點以下:
在瞭解這兩種切分方式的特色後,咱們就能夠根據本身的業務需求來選擇,一般會同時使用這兩種切分方式,垂直切分更偏向於業務拆分的過程,在技術上咱們更關注水平切分的方案。
PS: 稍候再討論一下水平切分的路由過程和分片維度~~