mysql分庫分表

一 概述

   分庫分表的順序應該是先垂直分,後水平分單個庫太大 如果是因爲表多而數據多,應使用垂直切分,根據業務切分成不同的庫。

   如果是因爲單張表的數據量太大,需要用水平切分,即把表的數據按某種規則切分成多張表,甚至多個庫上的多張表。

二、分庫

當單庫太大,業務上可能會遇到如下問題:

1.單個數據庫處理能力有限;

2.單庫所在服務器上磁盤空間不足;

3.單庫上操作的IO瓶頸 ;

可以採取的解決方案:切分成更多更小的庫,提高數據庫寫入能力。

1.垂直分庫

垂直分庫針對一個系統中的不同業務進行拆分,按照業務拆分到不同服務器上,例如交易按用戶,商品,訂單來拆分分別放到不同服務器上可以提高單機服務器處理能力,避免放在一個單機上出現性能瓶頸。在高併發場景下,垂直分庫一定程度上能夠突破IO、連接數及單機硬件資源的瓶頸。

三、分表

當單表太大,業務上可能會碰到如下問題:

1.影響增刪改查;

2.索引膨脹,查詢超時

可以採取的解決方案:切分成多個數據集更小的表。減少數據查詢所需要的時間,提高數據庫的吞吐。

1.垂直分表

也就是“大表拆小表”,基於列字段進行的。一般是表中的字段較多,將不常用的, 數據較大,長度較長(比如text類型字段)的拆分到“擴展表“。 主要針對那種幾百列的大表,避免查詢時數據量太大造成的“跨頁”問題。

2.水平分表

針對數據量巨大的單張表(比如訂單表),按照某種規則(RANGE,HASH取模等),切分到多張表裏面去。 但是這些表還是在同一個庫中。仍然無法解決庫的數據訪問存儲出現的IO瓶頸。

四、分庫分表

當數據庫面臨高併發訪問壓力,同時面對海量數據存儲,需要對數據庫採用分庫並採用分表,從而提高併發處理和查詢效率。

  1. 水平分庫分表

    將單張表的數據切分到多個服務器上去,每個服務器具有相應的庫與表,只是表中數據集合不同。 水平分庫分表能夠有效的緩解單機和單庫的性能瓶頸和壓力,突破IO、連接數、硬件資源等的瓶頸。

    2.水平分庫分表切分規則

(1)RANGE:從0到10000一個表,10001到20000一個表; 

(2)  hash取模:一個商場系統,一般都是將用戶,訂單作爲主表,然後將和它們相關的作爲附表,這樣不會造成跨庫事務之類的問題。 取用戶id,然後hash取模,分配到不同的數據庫上。

(3)地理區域:比如按照華東,華南,華北這樣來區分業務,很多雲服務應該是這樣。

(4)時間:按照時間切分,比如將6個月前或者一年前的數據切出去放到另外的一張表,時間長的表的數據被查詢的概率變小是冷數據,實現“冷熱數據分離”。

     3.一種分庫分表路由策略:

  中間變量=user_id%(庫數量x每個庫的表數量);

  庫=取整(中間變量/每個庫的表數量);

  表=中間變量%每個庫的表數量。

 

五、分庫分表後面臨的問題

1.分庫分表後,就成了分佈式事務了。如果依賴數據庫本身的分佈式事務管理功能去執行事務,會犧牲系統性能; 如果由應用程序去協助控制,會增加程序邏輯複雜度。

2.由於記錄被切分到不同的庫與不同的表當中,難以進行多表關聯查詢,還必須指定路由字段進行數據查詢。

3.分庫分表後對系統進一步擴容變得非常不方便需要重新數據遷移。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章