全部產品
Search
文件中心

PolarDB:概述

更新時間:Aug 14, 2024

本文將為您介紹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遷移過來的應用;