簡單了解分庫分表

2022-07-01 02:36:10 字數 3438 閱讀 4480

當資料量過大的時候對於資料庫的效能將是很大的考驗,因此將會選擇進行分庫或者分表,或者分庫分表結合進行來減少單一資料庫的壓力,進而提高資料庫的效能。從某種程度上說分庫分表是一種分治法,將大量資料變成小量資料,大表拆分為小表,從而運算元量少的一部分。

資料的拆分(sharding)根據其拆分規則的型別,可以分為兩種拆分模式。

一種是按照不同的表(或者schema)來拆分到不同的資料庫(主機)之上,這種拆分可以稱為資料的垂直(縱向)拆分;

另外一種則是根據表中的資料的邏輯關係,將同乙個表中的資料按照某種條件拆分到多台資料庫(主機)上面,這種拆分稱為資料的水平(橫向)拆分。

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

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

垂直拆分:即根據業務分類來進行拆分

垂直拆分優點:1、拆分後業務清晰,拆分規則明確;2、系統之間整合或擴充套件容易;3、資料維護簡單。

垂直拆分缺點:1、部分業務表無法join,只能通過介面方式解決,提高了系統複雜度;2、受每種業務不同的限制存在單庫效能瓶頸,不易資料擴充套件和效能提高;3、事務處理複雜。

垂直拆分又分為垂直分庫和垂直分表。

垂直分庫:指按照業務將表進行分類,分布到不同的資料庫上面,每個庫可以放在不同的伺服器上,從而達到多個伺服器共同分攤壓力的效果。它的核心理念是專庫專用。

垂直分庫帶來的提公升:1、解決業務層面的耦合,使業務更加清晰;2、能對不同業務的資料進行分級管理、維護、監控、擴充套件等;3、高併發場景下,垂直分庫在一定程度的提公升io、資料庫連線數、降低單機硬體資源的瓶頸。

垂直分表定義:將乙個表按照字段分成多表,每個表儲存其中一部分字段。也就是說將字段非常多的表拆分成多個表,每個表中分別存放一些字段資訊,從而減少資料量,因為把資料量都分散在了多個表中。將使用頻率高的字段存放在乙個表中,使用頻率低的字段放在另乙個表中。

垂直分表帶來的好處是:1.避免io爭搶並減少鎖表的機率;2.充分發揮熱門資料的操作效率,操作頻率高的資料為熱門資料,操作頻率低的資料為冷資料。

垂直拆分帶來的效能提公升主要集中在熱門資料的操作效率上,磁碟爭用情況減少。

為什麼大字段io效率低?

第一、由於資料量本身大,需要更長的讀取時間;第

二、跨頁問題,頁是資料庫儲存單位,很多查詢及定位操作都是以頁為單位,單頁內的資料行越多資料庫整體效能越好,而大字段占用空間大,單頁內儲存行數少,因此io效率較低;第三,資料庫以行為單位將資料載入到記憶體中,這樣表中字段長度較短且訪問頻率較高,記憶體能載入更多的資料,命中率更高,減少了磁碟io從而提公升了資料庫效能。

通常我們按以下原則進行垂直拆分:

1、把不常用的字段單獨放在一張表;2、把text,blob等大字段拆分出來放在附表中;3、經常組合查詢的列放在一張表中。

由於垂直拆分是按照業務的分類將表分散到不同的庫,所以有些業務表會過於龐大,存在單庫讀寫與儲存瓶頸,所以就需要採用水平拆分來解決垂直拆分的不足之處。

相對於垂直拆分,水平拆分不是將表做分類,而是按照某個欄位的某種規則來分散到多個庫之中,每個表中包含一部分資料。簡單來說,我們可以將資料的水平拆分理解為是按照資料行的拆分,就是將表中的某些行拆分到乙個資料庫,而另外的某些行又拆分到其他的資料庫中。

幾種典型的拆分分片規則包括:1、按照使用者id求模,將資料分散到不同的資料庫,具有相同資料使用者的資料都被分散到乙個庫中;2、按照日期,將不同月甚至日的資料分散到不同的庫中;3、按照某個特定的字段求摸,或者根據特定範圍段分散到不同的庫中。

水平拆分優點:1、拆分規則抽象好,join操作基本可以資料庫做;2、不存在單庫大資料,高併發的效能瓶頸;3、應用端改造較少;4、提高了系統的穩定性和負載能力。

水平拆分缺點:1、拆分規則難以抽象;2、分片事務一致性難以解決;3、資料多次擴充套件難度和維護量極大;4、跨庫join效能較差。

水平分庫是把同乙個表的資料按一定規則拆到不同的資料庫中,每個庫可以放在不同的伺服器上。水平分庫是把同乙個表拆到不同資料庫中,它是對資料行的拆分,不影響表結構。

它帶來的提公升:1、解決了單庫大資料,高併發的效能瓶頸;2、提高了系統的穩定性及可用性。(穩定性體現在io衝突減少,鎖定減少,可用性指某個庫出問題,部分可用。)

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

它帶來的提公升:1、優化單一表資料量過大而產生的效能問題;2、避免io爭搶並減少鎖表的機率。

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

前面講了垂直拆分跟水平拆分的不同和優缺點,會發現每種拆分方式都有缺點,但共同的缺點有:1、引入分布式事務的問題;2、跨節點join的問題;3、跨節點合併排序分頁問題;4、多資料來源管理問題。

一般來講業務存在著複雜join的場景是難以拆分的,往往業務獨立的易於拆分。如何拆分,拆分到何種程度是考驗技術架構的乙個難題。

拆分的一些原則:

第一原則:能不拆分盡量不要拆分。

第二原則:如果要拆分一定要選擇合適的拆分規則,提前規劃好。

第三原則:資料拆分盡量通過資料冗餘或表分組(table group)來降低跨庫join的可能。

第四原則:由於資料庫中介軟體對資料join實現的優劣難以把握,而且實現高效能難度極大,業務讀取盡量少使用多表join。

主要有兩種思路:a、客戶端模式,在每個應用程式模組中配置管理自己需要的乙個(或者多個)資料來源,直接訪問各個資料庫,在模組內完成資料的整合;b、通過中間**層來統一管理所有的資料來源,後端資料庫集群對前端應用程式透明。

垂直分表:可以把乙個寬表的字段按訪問頻次、是否是大字段的原則拆分為多個表,這樣既能使業務清晰,還能提公升部分效能。拆分後,盡量從業務角度避免聯查,否則效能方面將得不償失。

垂直分庫:可以把多個表按業務耦合鬆緊歸類,分別存放在不同的庫,這些庫可以分布在不同伺服器,從而使訪問壓力被多伺服器負載,大大提公升效能,同時能提高整體架構的業務清晰度,不同的業務庫可根據自身情況定製優化方案。但是它需要解決跨庫帶來的所有複雜問題。

水平分庫:可以把乙個表的資料(按資料行)分到多個不同的庫,每個庫只有這個表的部分資料,這些庫可以分布在不同伺服器,從而使訪問壓力被多伺服器負載,大大提公升效能。它不僅需要解決跨庫帶來的所有複雜問題,還要解決資料路由的問題。

水平分表:可以把乙個表的資料(按資料行)分到多個同乙個資料庫的多張表中,每個表只有這個表的部分資料,這樣做能小幅提公升效能,它僅僅作為水平分庫的乙個補充優化。

一般來說,在系統設計階段就應該根據業務耦合鬆緊來確定垂直分庫,垂直分表方案。在資料量及訪問壓力不是特別大的情況,首先考慮快取、讀寫分離、索引技術等方案。若資料量極大且持續增長再考慮水平分庫、分表方案。

(1)

(2)

(3) (比較詳細)

分表分庫初步理論了解

1 基本1.思想之什麼是分庫分表?從字面上簡單理解,就是把原本儲存於乙個庫的資料分塊儲存到多個庫上,把原本儲存於乙個表的資料分塊儲存到多個表上。2 基本2.思想之為什麼要分庫分表?資料庫中的資料量不一定是可控的,在未進行分庫分表的情況下,隨著時間和業務的發展,庫中的表會越來越多,表中的資料量也會越來...

mycat分庫分表簡單入門

本教程是在window環境下執行的,實際生產推薦在linux上執行。必備條件 自行安裝,如果不會裝請先打好基礎在來學習 在db02和db03中分別建立item表,sql指令碼如下 create database db02 create table item id int not null auto ...

mysql分表分庫實現 MySql分表分庫思路

一.資料庫瓶頸 1.1io瓶頸 第一種 磁碟讀io瓶頸,熱點資料太多,資料庫快取放不下,每次查詢時會產生大量的io 分庫和垂直分表 第二種 網路io瓶頸,請求的資料太多,網路頻寬不夠 分庫 1.2cpu瓶頸 第一種 sql問題,如sql中包含join,group by,order by,非索引字段條...