做架構之資料分割槽
本文主要內容:
- 1.什麼是資料分割槽?
- 2.為什麼要資料分割槽?
- 3.資料分割槽有哪些型別?
- 4.以MySQL為例,分割槽表的優缺點有哪些?
一、什麼是資料分割槽?
分割槽是將表和索引分成較小的部分,甚至將其細分為較小的部分。可以將它想象成在一個大倉庫(一張大桌子)中存放著數百萬本不同主題和年份(例如2000–2019年)的不同雜誌。分割槽意味著您將把它們組織在那個大倉庫內的不同房間中。它們仍然屬於一個倉庫,但是現在您根據資料庫分割槽策略在邏輯級別上對它們進行分組。
二、為什麼要資料分割槽?
它的目的是為了在特定的SQL操作中減少資料讀寫的總量以縮減響應時間。
三、資料分割槽有哪些型別?
- 1.範圍分割槽;
- 2.雜湊分割槽;
- 3.列表分割槽。
1.範圍分割槽
概念:按照資料表中某個值的範圍進行分割槽,根據值的範圍,決定將該資料儲存在哪個分割槽中
使用場景:通過繫結自定義的列進行分割槽,其中最突出的就是根據時間分割槽,例如 : 客戶下單時間,可以分月,季度,半年的形式來縮減資料的量以免在資料庫查詢時進行全表掃描。
建立分割槽:
create table orders ( order_no NUMBER(5), person VARCHAR2(30), year_month NUMBER(6) ) //year_month PARTITION BY RANGE (year_month) ( // 分割槽的區域 p1,p2,..pn PARTITION P1 values less than (4) tablespace data0, PARTITION P2 values less than (8) tablespace data1, ...... PARTITION Pn values less than (99) tablespace datan );
2.列表分割槽
概念:當資料為一系列離散的數值時,可以進行列表分割槽。列表分割槽的分割槽鍵由一個單獨的列組成,進行操作時,可以直接通過所要操作的資料去查詢相應 的分割槽。
列表分割槽的優缺點歸納:
- (1)優點:列表分割槽最大的優勢是可以通過分割槽來很方便的查詢相應的資料,但是列表分割槽有很大的侷限性,這種分割槽技術要求資料的重複率比較高。
- (2)缺點:分割槽與記錄值是無關 的,實施難度和可維護性都比較差,而且他的資料分割槽可能不均勻,這時需要用到雜湊分割槽來儲存資料了。
使用場景:
取一些資料庫中列的值經常性重複的,例如:財經新聞的地域標籤,每個新聞都有標籤,根據使用者的喜愛或者經常點選的新聞在資料庫中新增新聞標籤,等下次展示新聞時根據新聞標籤去搜索新聞。
建立分割槽:
create table news
(
news_no NUMBER(5),
person VARCHAR2(30),
year_month NUMBER(6)
)
//通過person這一列進行分割槽
PARTITION BY LIST (person)
(
//分割槽p1的值是abc
PARTITION P1 values ('abc'),
//分割槽p2的值是def,adf
PARTITION P2 values ('def','adf'),
.......
PARTITION Pn values ('wfs')
);
3.雜湊分割槽
概念:所謂雜湊分割槽,首先將分割槽編號,之後通過雜湊函式來指定分割槽儲存資料。雜湊分割槽一般追求的是資料在分割槽上均勻分佈的特性。在雜湊分割槽中,使用者不必考慮自己指定一個列值或列值集合應該存在哪個分割槽上,資料庫自動完成相應的工作。使用者只需要確定雜湊分割槽產生的分割槽數量,以及確定雜湊分割槽的雜湊函式進行雜湊分割槽的操作。
使用場景:將股票的程式碼等唯一性比較強的列設定為分割槽條件。
雜湊分割槽的特點歸納:
- (1)基於分割槽欄位的雜湊值,自動將記錄插入到指定分割槽中;
- (2)分割槽數一般是2的冪;
- (3)易於實施;
- (4)總體效能是最佳的;
- (5)更適於靜態資料;
- (6)適於資料的均勻儲存;
- (7)資料管理能力比較弱;
- (8)對資料值無法控制。
建立分割槽:
create table stocks
(
stocks_no NUMBER(6),
person VARCHAR2(30),
year_month NUMBER(6)
)
PARTITION BY hash(stocks_no) partitions 4 as select * from dba_objects;
4.三種分割槽的比較
- (1)範圍分割槽:主要特點是能根據資料的範圍將不同範圍的資料儲存在不同的分割槽裡。範圍分割槽的特點決定了 它可能是在儲存一些資料時必須選擇的儲存方式。若是按照時間範圍來儲存資料,範圍分割槽是唯一合適的儲存方式。
- (2)雜湊分割槽:主要特點是能將資料比較均勻的分配到各個分割槽中,保證各個分割槽能比較均衡的被利用。當資料重複率高時,雜湊分割槽將大量的資料儲存在同一個分割槽中,這樣會導致分割槽儲存的資料不均勻,也會影響到後面資料的操作。雜湊分割槽更適合於儲存資料重複率比較低的資料。
- (3)列表分割槽:主要特點是按照欄位的值來對資料進行分割槽。列表分割槽對資料的欄位值進行劃分,不同的欄位值儲存在不同的分割槽上。它適合於儲存一些重複率比較高的資料。
四、以MySQL為例,分割槽表的優缺點有哪些?
1.優點
在MySQL Server層分割槽表為一個表,而在MySQL儲存引擎層分割槽表是多個表,因此有如下特點:
- (1)分割槽表對業務透明,只需要維護一個表的資料結構。
- (2)DML操作加鎖僅影響操作的分割槽,不會影響未訪問分割槽。
- (3)通過分割槽交換快速將資料換入和換出分割槽表。
- (4)通過TRUNCATE操作快速清理特定分割槽資料。
- (5)通過強制分割槽僅訪問特定分割槽資料,減少操作影響。
- (6)通過大資料量分割槽能有效降低索引層數,提高查詢效能。
2.缺點
由於分割槽表在MySQL Server層為一個表,因此:
- (1)DDL操作需要鎖定所有分割槽,導致所有分割槽上操作都被阻塞。
- (2)當表資料量較小時,分割槽表和非分割槽表效能相近,分割槽表效果有限。
- (3)當表資料量較大時,對分割槽表進行DDL或其他運維操作難度大風險高。
- (4)分割槽表使用較少,存在未知風險多,BUG多BUG多BUG多,MySQL社群版本免費,橫向擴充套件成本低,分庫分表實現簡單且中介軟體完善。- - (5)當單臺伺服器效能無法滿足時,對分割槽表進行分拆的成本較高,而分庫分表能很容易實現橫向分拆。
- (6)當分割槽表操作不當導致訪問所有分割槽時,會導致嚴重的效能問題,而分庫分表操作不當僅影響訪問的表。
- (7)使用分庫分表可以有效運維降低運維操作影響,對1億資料量表做DDL操作需要謹慎評估,而對10萬資料量表做DDL操作可以預設其很快完成。
- (8)使用分庫分表可以有效減小宕機或其他故障影響,將資料分庫分表到10套群集上,一套群集發生故障僅影響業務的一成。