分區(qū)類型介紹
PolarDB-X數(shù)據(jù)庫提供了多種不同類型的分區(qū)策略,用于數(shù)據(jù)庫控制如何將數(shù)據(jù)放入分區(qū), 包括以下幾種:
Hash類型的分區(qū)策略
HASH(兼容社區(qū)MySQL的HASH分區(qū)語法)
KEY(兼容社區(qū)MySQL的KEY分區(qū)語法)
Range類型的分區(qū)策略
RANGE(兼容社區(qū)MySQL的RANGE分區(qū)語法)
RANGE COLUMNS(兼容社區(qū)MySQL的RANGE COLUMNS分區(qū)語法)
List類型的分區(qū)策略
LIST(兼容社區(qū)MySQL的LIST分區(qū)語法)
LIST COLUMNS(兼容社區(qū)MySQL的LIST COLUMNS分區(qū)語法)
特定場景的分區(qū)策略
CO_HASH(PolardDB-X 的特色分區(qū)語法)
Hash類型
基于用戶指定的分區(qū)列或分區(qū)函數(shù)表達式的值,使用內(nèi)置的一致性哈希算法計算其哈希值并進行分區(qū)路由的策略。按是否支持使用分區(qū)函數(shù)表達式或使用多個分區(qū)列作為分區(qū)鍵,Hash分區(qū)策略又可以細分為Key分區(qū)和Hash分區(qū)兩種分區(qū)策略。
表 1. Key分區(qū)策略與Hash分區(qū)策略對比
分區(qū)策略 | 分區(qū)鍵支持 | 是否支持分區(qū)函數(shù) | 語法示例 | 特點與限制 | 路由描述(點查) |
Key(默認的分區(qū)策略) | 單列分區(qū)鍵 | 否 | PARTITION BY KEY(c1) |
|
|
向量分區(qū)鍵 | 否 | PARTITION BY KEY(c1,c2,...,cn) |
|
| |
Hash | 單列分區(qū)鍵 | 否 | PARTITION BY HASH(c1) |
| PARTITION BY HASH(c1)與PARTITION BY KEY(c1)完全等同 ,其路由算法與PARTITION BY KEY(c1)完全一致。 |
是 | PARTITION BY HASH(YEAR(c1)) |
| |||
向量分區(qū)鍵 | 否 | PARTITIONBY HASH(c1,c2,...,cn) |
|
|
Range類型
基于用戶指定的分區(qū)列或分區(qū)函數(shù)表達式的值,通過比較計算來確定數(shù)據(jù)位于哪些預(yù)定義分區(qū)的范圍并進行分區(qū)路由的策略。按是否支持使用分區(qū)函數(shù)表達式或使用多個分區(qū)列作為分區(qū)鍵,Range分區(qū)策略又可以細分為Range Columns分區(qū)和Range分區(qū)兩種分區(qū)策略。
表 2. Range Columns分區(qū)策略與Range分區(qū)策略對比
分區(qū)策略 | 分區(qū)鍵支持 | 是否支持分區(qū)函數(shù) | 語法示例 | 特點與限制 | 路由描述(點查) |
Range Columns | 單列分區(qū)鍵& 向量分區(qū)鍵 | 否 | PARTITION BY RANGE COLUMNS (c1,c2,...,cn) ( PARTITION p1 VALUES LESS THAN (1,10,...,1000), PARTITION p2 VALUES LESS THAN (2,20,...,2000) ...) | 支持熱點分裂(例如c1有熱點值88,可以使用c2進行分區(qū)分裂解決熱點)。 |
|
Range | 單列分區(qū)鍵 | 是 | PARTITION BY RANGE(YEAR(c1)) ( PARTITION p1 VALUES LESS THAN (2019), PARTITION p2 VALUES LESS THAN (2021) ...) |
|
|
List類型
與Range分區(qū)策略類似,基于用戶指定的分區(qū)列或分區(qū)函數(shù)表達式的值,通過比較計算來確定數(shù)據(jù)位于哪些預(yù)定義分區(qū)的取值集合并進行分區(qū)路由的策略。按是否多個分區(qū)列作為分區(qū)鍵以及其使用方式的不同,List類型也分為List Columns分區(qū)和List分區(qū)兩種分區(qū)策略。
表 3. List Columns分區(qū)策略與List分區(qū)策略對比
分區(qū)策略 | 分區(qū)鍵支持 | 是否支持分區(qū)函數(shù) | 語法示例 | 特點與限制 | 路由描述(點查) |
List Columns | 單列分區(qū)鍵& 向量分區(qū)鍵 | 否 | PARTITION BY LIST COLUMNS (c1,c2,...,cn) ( PARTITION p1 VALUES IN ((1,10,...,1000),(2,20,...,2000) ), PARTITION p2 VALUES IN ((3,30,...,3000),(3,30,...,3000) ), ...) | 不支持熱點分裂 |
|
List | 單列分區(qū)鍵 | 是 | PARTITION BY LIST(YEAR(c1)) ( PARTITION p1 VALUES IN (2018,2019), PARTITION p2 VALUES IN (2020,2021) ...) | 不支持熱點分裂。 |
CoHash類型
PolarDB-X還針對比較常見的特定的應(yīng)用場景新擴展了一種新的名為CoHash的哈希分區(qū)策略,該策略可有效解決一個表需要同時按多個不同的相互有協(xié)同關(guān)系的分區(qū)列進行水平分區(qū)的問題。
由于CoHash分區(qū)策略與前面的Hash/Key分區(qū)策略有些類似,以下是它們的一些主要用法異同的對比。
表 4. 與Hash/Key分區(qū)策略的主要區(qū)別
主要區(qū)別點 | CO_HASH | KEY | Hash |
語法示例 | PARTITION BY CO_HASH(c1, c2) PARTITOINS 8 | PARTITION BY KEY(c1, c2) PARTITOINS 8 | PARTITION BY HASH(c1, c2) PARTITOINS 8 |
單列分區(qū)鍵 | 不支持 | 支持 | 支持 |
向量分區(qū)鍵 | 支持 | 支持。 | 支持 |
向量分區(qū)列是否允許使用分區(qū)函數(shù) | 允許。例如PARTITION BY CO_HASH( /*取c1列的后4位字符*/ RIGHT(c1, 4), /*取c2列的后4位字符*/ RIGHT(c2, 4) ) PARTITOINS 8 | 不允許 | 不允許 |
分區(qū)列之間的關(guān)系 | 協(xié)同關(guān)系。同一個的分區(qū)列取值的協(xié)同關(guān)系由業(yè)務(wù)提供并負責維護。例如:
| 類似聯(lián)合索引的前綴關(guān)系。 | 類似聯(lián)合索引的前綴關(guān)系。 |
前綴列等值查詢分區(qū)裁剪及示例 | 支持。例如:
| 支持。例如:
| 不支持,必須帶上全分區(qū)列等值條件才支持分區(qū)裁剪。例如:
|
非前綴列等查詢分區(qū)裁剪及示例 | 支持。所有分區(qū)列的等值條件均支持獨立的分區(qū)裁剪。例如:
| 不支持。非前綴分區(qū)等值條件必須全分區(qū)掃描。例如:
| 不支持。非前綴分區(qū)等值條件必須全分區(qū)掃描。例如:
|
范圍查詢 | 不支持。全分區(qū)掃描。 | 不支持。全分區(qū)掃描。 | 不支持。全分區(qū)掃描。 |
路由描述(點查) |
| 可參考前邊的“Key分區(qū)與Hash 分區(qū)”的描述,此處忽略。 | 可參考前邊的“Key分區(qū)與 Hash分區(qū)”的描述,此處忽略。 |
熱點分裂 | 不支持。無法對某個具體的熱點值(比如c1='88') 進行進一步熱點分裂 | 支持 | 不支持 |
分區(qū)管理(常見的分區(qū)分裂、合并與遷移等) | 支持 | 支持 | 支持 |
二級分區(qū) | 支持 | 支持 | 支持 |