淺談分庫分表

在這裏插入圖片描述

分庫分表是什麼

分庫分表就是爲了解決由於數據量過大而導致數據庫性能降低的問題,將原來獨立的數據庫拆分成若干數據庫組成 ,將數據大表拆分成若干數據表組成,使得單一數據庫、單一數據表的數據量變小,從而達到提升數據庫性能的目的。

分庫分表的方式

分庫分表包括分庫和分表兩個部分,在生產中通常包括:垂直分庫、水平分庫、垂直分表、水平分表四種方式。

垂直分表

垂直分表定義:將一個表按照字段分成多表,每個表存儲其中一部分字段。

  • 它帶來的提升是:
    1. 爲了避免IO爭搶並減少鎖表的機率,查看詳情的用戶與商品信息瀏覽互不影響
    2. 充分發揮熱門數據的操作效率,商品信息的操作的高效率不會被商品描述的低效率所拖累。

一般來說,某業務實體中的各個數據項的訪問頻次是不一樣的,部分數據項可能是佔用存儲空間比較大的BLOB或 是TEXT。所以,當表數據量很大時,可以將表按字段切開,將熱門字段、冷門字段分開放 置在不同庫中,這些庫可以放在不同的存儲設備上,避免IO爭搶。垂直切分帶來的性能提升主要集中在熱門數據的 操作效率上,而且磁盤爭用情況減少。

  • 通常我們按以下原則進行垂直拆分:
    1. 把不常用的字段單獨放在一張表;
    2. 把text,blob等大字段拆分出來放在附表中;
    3. 經常組合查詢的列放在一張表中;

垂直分庫

垂直分庫是指按照業務將表進行分類,分佈到不同的數據庫上面,每個庫可以放在不同的服務器上,它的核心理念 是專庫專用。

它帶來的提升是:

  1. 解決業務層面的耦合,業務清晰
  2. 能對不同業務的數據進行分級管理、維護、監控、擴展等
  3. 高併發場景下,垂直分庫一定程度的提升IO、數據庫連接數、降低單機硬件資源的瓶頸

垂直分庫通過將表按業務分類,然後分佈在不同數據庫,並且可以將這些數據庫部署在不同服務器上,從而達到多 個服務器共同分攤壓力的效果,但是依然沒有解決單表數據量過大的問題。

水平分庫

水平分庫是把同一個表的數據按一定規則拆到不同的數據庫中,每個庫可以放在不同的服務器上。

它帶來的提升是:

  1. 解決了單庫大數據,高併發的性能瓶頸。
  2. 提高了系統的穩定性及可用性。

當一個應用難以再細粒度的垂直切分,或切分後數據量行數巨大,存在單庫讀寫、存儲性能瓶頸,這時候就需要進 行水平分庫了,經過水平切分的優化,往往能解決單庫存儲量及性能瓶頸。但由於同一個表被分配在不同的數據 庫,需要額外進行數據操作的路由工作,因此大大提升了系統複雜度。

水平分表

水平分表是在同一個數據庫內,把同一個表的數據按一定規則拆到多個表中。

它帶來的提升是:

  1. 優化單一表數據量過大而產生的性能問題
  2. 避免IO爭搶並減少鎖表的機率

庫內的水平分表,解決了單一表數據量過大的問題,分出來的小表中只包含一部分數據,從而使得單個表的數據量 變小,提高檢索性能。

分庫分錶帶來的問題

分庫分表能有效的緩解了單機和單庫帶來的性能瓶頸和壓力,突破網絡IO、硬件資源、連接數的瓶頸,同時也帶來 了一些問題。

事務一致性問題

由於分庫分表把數據分佈在不同庫甚至不同服務器,不可避免會帶來分佈式事務問題。

跨節點關聯查詢

在沒有分庫前,我們檢索商品時可以通過以下SQL對店鋪信息進行關聯查詢:

SELECT p.*,r.[地理區域名稱],s.[店鋪名稱],s.[信譽] FROM [商品信息] p LEFT JOIN [地理區域] r ON p.[產地] = r.[地理區域編碼] LEFT JOIN [店鋪信息] s ON p.id = s.[所屬店鋪] WHERE...ORDER BY...LIMIT...

但垂直分庫後[商品信息]和[店鋪信息]不在一個數據庫,甚至不在一臺服務器,無法進行關聯查詢。 可將原關聯查詢分爲兩次查詢,第一次查詢的結果集中找出關聯數據id,然後根據id發起第二次請求得到關聯數 據,最後將獲得到的數據進行拼裝。

跨節點分頁、排序函數

在使用Max、Min、Sum、Count之類的函數進行計算的時候,與排序分頁同理,也需要先在每個分片上執行相應 的函數,然後將各個分片的結果集進行彙總和再次計算,最終將結果返回。

主鍵避重

在分庫分表環境中,由於表中數據同時存在不同數據庫中,主鍵值平時使用的自增長將無用武之地,某個分區數據 庫生成的ID無法保證全局唯一。因此需要單獨設計全局主鍵,以避免跨庫主鍵重複問題。

公共表

實際的應用場景中,參數表、數據字典表等都是數據量較小,變動少,而且屬於高頻聯合查詢的依賴表。例子中地 理區域表也屬於此類型。

可以將這類表在每個數據庫都保存一份,所有對公共表的更新操作都同時發送到所有分庫執行。

由於分庫分表之後,數據被分散在不同的數據庫、服務器。因此,對數據的操作也就無法通過常規方式完成,並且 它還帶來了一系列的問題。好在,這些問題不是所有都需要我們在應用層面上解決,市面上有很多中間件可供我們 選擇,其中Sharding-JDBC使用流行度較高,我們來了解一下它。

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