本文將為您介紹Sequence的相關概念和類型。
PolarDB-X全域唯一數字序列(64位元字,對應MySQL中Signed BIGINT類型,以下簡稱為Sequence)的主要目標是為了產生全域唯一和有序遞增的數字序列,常用於主鍵列、唯一索引列等值的產生。
基本概念
瞭解以下概念,將協助您更好地選用Sequence:
連續:如果本次取值為n,下一次取值一定是n + 1,則是連續的;如果下一次取值不能保證為n + 1,則是非連續的;
單調遞增:如果本次取值為n,下一次取值一定是一個比n大的數,則是單調遞增的;
宏觀上單調遞增,微觀上非單調遞增:類似於1、3、2、4、5、7、6、8、......這樣的序列,這個序列從宏觀是看是遞增的,微觀上非單調遞增。
單元化能力:指能夠跨執行個體或跨庫分配全域唯一數字序列的能力。
用法
PolarDB-X中的Sequence主要有兩類:
顯式Sequence:通過DDL文法建立和維護,可以獨立使用;通過
select seq.nextval
擷取序列值,seq是具體Sequence的名字。隱式Sequence:通過為主鍵定義AUTO_INCREMENT,主索引值能夠自動填滿,由PolarDB-X自動維護。
支援的Sequence類型及特性
PolarDB-X目前共支援如下三種Sequence類型:
類型(縮寫) | 全域唯一 | 連續 | 單調遞增 | 同一串連內單調遞增 | 資料類型 | 可讀性 | 單元化能力 |
New Sequence(NEW) | 是 | 是 | 是 | 是 | 所有整型 | 好 | 否 |
Group Sequence(GROUP) | 是 | 否 | 否 | 是 | 所有整型 | 好 | 是 |
Time-based Sequence(TIME) | 是 | 否 | 宏觀上單調遞增,微觀上非單調遞增 | 是 | 僅支援BIGINT | 差 | 否 |
New Sequence(NEW)
全域唯一、連續、單調遞增的Sequence,產生的值是預設從1開始的自然數序列。
在5.4.14及以上版本的AUTO模式資料庫中,如果未指定Sequence類型,預設使用New Sequence。
僅在5.4.17及以上版本支援自訂步長、限定最大值和迴圈分配特性。
其他使用限制請參見New Sequence。
優點:全域唯一、連續、單調遞增、高效能,支援自訂步長、限定最大值和迴圈分配特性。
缺點:依賴GMS功能,比其他類型Sequence相對佔用更多的GMS資源。
樣本:
建立一個起始值為100000的New Sequence,會嚴格產生如下序列,保證全域唯一、連續、單調遞增。
100000、100001、100002、100003、100004、.....、199999,200000、200001、200002、200003、......
Group Sequence(GROUP)
全域唯一的Sequence,產生的值是自然數序列,預設從100001開始,但是不保證連續和單調遞增。預設不指定任何單元化參數時,會建立僅有一個單元的Group Sequence,絕大多數情境僅需要一個單元。
如果建立時指定了單元數量(參數名為UNIT COUNT)大於一,則建立的Group Sequence具備了單元化能力。單元化Group Sequence具備以下特性:
單元數量決定了單元化Group Sequence的全域唯一數字序列分配空間;
每個單元(由參數單元索引INDEX指)佔用全域唯一數字序列分配空間中的一個子集;
不同單元(單元索引不同)佔用的子集之間不重疊(即會分配不同的Sequence值)。
實現原理:採用多個節點產生值來保證高可用,每次取出一段值,如果該段值沒有取完(例如串連斷掉等情形),就會產生跳躍段。
優點:全域唯一,不會產生單點問題,效能非常好,並且具備跨執行個體或跨庫的單元化能力。
缺點:產生的序列不連續,可能會有跳躍段;不會嚴格從起始值開始取值。
其他使用限制請參見Group Sequence。
樣本:
建立一個起始值為100000的Group Sequence,會產生如下序列,僅保證全域唯一。
200001、200002、200003、200004、100001、100002、100003、200005、200006、......
Group Sequence實際分配的起始值,並不會嚴格從設定的起始值開始,但可以保證大於起始值。以上樣本中是從200001開始取值的。
Group Sequence保證全域唯一,但是會有跳躍段。例如Group Sequence的某個節點失效,或者某個串連只取了一部分值,然後該串連被關閉了,都會產生跳躍段。以上樣本中200004和100001之間、100003和200005之間產生了跳躍段。
Time-based Sequence(TIME)
基於時間戳記+節點編號+序號組合而成的一種Sequence,保證全域唯一和宏觀自增;這種Sequence值的更新不依賴於資料節點,也不需要持久化到資料庫,僅在資料庫中保留名稱和類型資訊,效能很好;產生的是類似於776668092129345536、776668098018148352、776668111578333184、776668114812141568、......
這樣的序列值。
優點:全域唯一、效能很好。
缺點:產生的序列不連續,起始值、步長、最大值、是否迴圈這些參數對於Time-based Sequence無意義。
用於表中自增列時,必須使用BIGINT類型。
使用情境
這三種Sequence都保證全域唯一,均可以應用在主鍵列和唯一索引列。
5.4.14及以上版本的AUTO模式資料庫中,推薦只使用New Sequence;
DRDS模式資料庫中,預設使用Group Sequence;
Group Sequence僅用於單元化和相容PolarDB-X 1.0遷移過來的應用;
Time-based Sequence僅用於相容PolarDB-X 1.0遷移過來的應用;