全部產品
Search
文件中心

PolarDB:概述

更新時間:Jul 06, 2024

分區類型介紹

PolarDB-X資料庫提供了多種不同類型的分區策略,用於資料庫控制如何將資料放入分區, 包括以下幾種:

  • Hash類型的分區策略

    • HASH(相容社區MySQL的HASH分區文法)

    • KEY(相容社區MySQL的KEY分區文法)

  • Range類型的分區策略

    • RANGE(相容社區MySQL的RANGE分區文法)

    • RANGE COLUMNS(相容社區MySQL的RANGE COLUMNS分區文法)

  • List類型的分區策略

    • LIST(相容社區MySQL的LIST分區文法)

    • LIST COLUMNS(相容社區MySQL的LIST COLUMNS分區文法)

  • 特定情境的分區策略

    CO_HASH(PolardDB-X 的特色分區文法)

Hash類型

基於使用者指定的分區列或分區函數運算式的值,使用內建的一致性雜湊演算法計算其雜湊值並進行分區路由的策略。按是否支援使用分區函數運算式或使用多個分區列作為分區鍵,Hash分區策略又可以細分為Key分區Hash分區兩種分區策略。

表 1. Key分區策略與Hash分區策略對比

分區策略

分區鍵支援

是否支援分區函數

文法樣本

特點與限制

路由描述(點查)

Key(預設的分區策略)

單列分區鍵

PARTITION BY KEY(c1)

  • 不支援熱點分裂;

  • 最多有1個分區列參與路由計算;

  1. 按c1列的值,使用一致性雜湊演算法計算其雜湊c1_hash;

  2. 按雜湊值 c1_hash進行分區路由。

向量分區鍵

PARTITION BY KEY(c1,c2,...,cn)

  • 支援熱點分裂;

  • 建表後預設僅第1個分區列c1實際參與路由計算,熱點分裂時可以使用c2,...,cn等更多的分區列;

  • 最多允許n個分區列同時參與路由計算;

  • 分區列數目n預設不能超過5個。

  1. (c1,c2,...,cn)這N個列的值組成一組分區鍵向量,並使用一致性雜湊演算法為向量的各個列的值計算其雜湊值,從而將一個分區鍵向量映射成一個雜湊值向量(c1_hash,c2_hash,...,cn_hash)

  2. 將雜湊值向量(c1_hash,c2_hash,...,cn_hash)按range路由並找到目標資料分割。

Hash

單列分區鍵

PARTITION BY HASH(c1)

  • 不支援熱點分裂;

  • 一個分區列參與路由。

  • 目前支援11個分區函數:

    • YEAR

    • MONTH

    • DAYOFMONTH

    • DAYOFWEEK

    • DAYOFYEAR

    • TO_DAYS

    • TO_MONTHS

    • TO_WEEKS

    • TO_SECONDS

    • UNIX_TIMESTAMP

    • SUBSTR/SUBSTRING

PARTITION BY HASH(c1)與PARTITION BY KEY(c1)完全等同 ,其路由演算法與PARTITION BY KEY(c1)完全一致。

PARTITION BY HASH(YEAR(c1))

  1. 按c1列的值,使用YEAR分區Function Compute其對應的年份year;

  2. 將年份year使用一致性雜湊演算法計算其雜湊值year_hash;

  3. 按雜湊值year_hash進行分區路由。

向量分區鍵

PARTITIONBY HASH(c1,c2,...,cn)

  • 不支援熱點分裂;

  • 建表後,n個分區列將同時與路由;

  • 分區列數目n預設不能超過5個。

  1. (c1,c2,...,cn)這N個分區列的值組成一組向量,並使用一致性雜湊演算法,計算該向量對應雜湊值hashVal;

  2. 按雜湊hashVal進行分區路由。

Range類型

基於使用者指定的分區列或分區函數運算式的值,通過比較計算來確定資料位元於哪些預定義分區的範圍並進行分區路由的策略。按是否支援使用分區函數運算式或使用多個分區列作為分區鍵,Range分區策略又可以細分為Range Columns分區Range分區兩種分區策略。

表 2. Range Columns分區策略與Range分區策略對比

分區策略

分區鍵支援

是否支援分區函數

文法樣本

特點與限制

路由描述(點查)

Range Columns

單列分區鍵& 向量分區鍵

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進行分區分裂解決熱點)。

  1. (c1,c2,...,cn)這N個列的值組成一組分區鍵向量;

  2. 根據這個分區鍵向量(c1,c2,...,cn)按二分尋找演算法判斷它屬於哪個預定義分區,並最終路由到目標資料分割。

Range

單列分區鍵

PARTITION BY RANGE(YEAR(c1)) ( PARTITION p1 VALUES LESS THAN (2019), PARTITION p2 VALUES LESS THAN (2021) ...)

  • 不支援熱點分裂;

  • 目前支援的分區函數:

    • YEAR

    • MONTH

    • DAYOFMONTH

    • DAYOFWEEK

    • DAYOFYEAR

    • TO_DAYS

    • TO_MONTHS

    • TO_WEEKS

    • TO_SECONDS

    • UNIX_TIMESTAMP

    • SUBSTR/SUBSTRING

  1. 按c1列的值,使用YEAR分區Function Compute其對應的年份year;

  2. 年份year按二分尋找演算法判斷它屬於哪個預定義分區,並路由到目標資料分割。

List類型

與Range分區策略類似,基於使用者指定的分區列或分區函數運算式的值,通過比較計算來確定資料位元於哪些預定義分區的取值集合并進行分區路由的策略。按是否多個分區列作為分區鍵以及其使用方式的不同,List類型也分為List Columns分區List分區兩種分區策略。

表 3. List Columns分區策略與List分區策略對比

分區策略

分區鍵支援

是否支援分區函數

文法樣本

特點與限制

路由描述(點查)

List Columns

單列分區鍵& 向量分區鍵

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) ), ...)

不支援熱點分裂

  1. (c1,c2,...,cn)這N個列的值組成一組分區鍵向量;

  2. 根據這個分區鍵向量(c1,c2,...,cn)按二分尋找演算法判斷它屬於哪個預定義分區,並最終路由到目標資料分割。

List

單列分區鍵

PARTITION BY LIST(YEAR(c1)) ( PARTITION p1 VALUES IN (2018,2019), PARTITION p2 VALUES IN (2020,2021) ...)

不支援熱點分裂。

CoHash類型

PolarDB-X還針對比較常見的特定的應用情境新擴充了一種新的名為CoHash的雜湊分割策略,該策略可有效解決一個表需要同時按多個不同的相互有協同關係的分區列進行水平資料分割的問題。

由於CoHash分區策略與前面的Hash/Key分區策略有些類似,以下是它們的一些主要用法異同的對比。

表 4. 與Hash/Key分區策略的主要區別

主要區別點

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

單列分區鍵

不支援

支援

支援

向量分區鍵

支援

支援。

支援

向量分區列是否允許使用分區函數

允許。例如PARTITION BY

CO_HASH(

/*取c1列的後4位字元*/

RIGHT(c1, 4),

/*取c2列的後4位字元*/

RIGHT(c2, 4)

)

PARTITOINS 8

不允許

不允許

分區列之間的關係

協同關係。同一個的分區列取值的協同關係由業務提供並負責維護。例如:

  • c1 與 c2 的取值總是相同

  • 適合使用 CO_HASH(c1, c2)

  • c1 與 c2 的後4位字元總是相同

  • 適合使用 CO_HASH(RIGHT(c1,4), RIGHT(c2,4)))

類似聯合索引的首碼關係。

類似聯合索引的首碼關係。

首碼列等值查詢分區裁剪及樣本

支援。例如:

  • c1='x': 支援分區裁剪並路由到單個分區;

  • c1='x' and c2='y': 支援分區裁剪並路由到一個或0個分區(如果 c1='x'與c2='y'的路由分區不一樣,則返回0個分區)。

支援。例如:

  • c1='x':支援分區裁剪並路由到一個或多個分區(如果x值進行了熱點分列,會返回多個分區);

  • c1='x' and c2='y':支援分區裁剪並路由到單個分區。

不支援,必須帶上全分區列等值條件才支援分區裁剪。例如:

  • c1='x': 無法裁剪並全分區掃描;

  • c1='x' and c2='y': 支援分區裁剪並路由到單個分區。

非首碼列等查詢分區裁剪及樣本

支援。所有分區列的等值條件均支援獨立的分區裁剪。例如:

  • c2='x': 支援分區裁剪並路由到單個分區;

  • c1='x' or c2='y': 支援分區裁剪並路由到1個或2個分區(如果 c1='x'與c2='y'的路由分區是一樣,則返回1個分區,否則掃描2個分區)。

不支援。非首碼分區等值條件必須全分區掃描。例如:

  • c2='x': 全分區掃描;

  • c1='x' or c2='y': 全分區掃描。

不支援。非首碼分區等值條件必須全分區掃描。例如:

  • c2='x': 全分區掃描;

  • c1='x' or c2='y': 全分區掃描。

範圍查詢

不支援。全分區掃描。

不支援。全分區掃描。

不支援。全分區掃描。

路由描述(點查)

  1. 提取c1列(其他的分區列與之一樣)的等值查詢的原始值 v1 ;

  2. 如果c1列使用了分區函數,則計算v1列的分區函數取值,f1 = partFunc(v1),否則取 f1 = v1;

  3. 使用一致性雜湊演算法計算 f1 的雜湊值 c1_hash(long類型的整數);

  4. 按雜湊值c1_hash 進行分區路由。

可參考前邊的“Key分區與Hash 分區”的描述,此處忽略。

可參考前邊的“Key分區與 Hash分區”的描述,此處忽略。

熱點分裂

不支援。無法對某個具體的熱點值(比如c1='88') 進行進一步熱點分裂

支援

不支援

分區管理(常見的分區分裂、合并與遷移等)

支援

支援

支援

二級分區

支援

支援

支援