开发指南—Sequence—概述

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 本文将为您介绍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:通过Sequence DDL语法创建和维护,可以独立使用;通过select seq.nextval获取序列值,seq 是具体Sequence的名字。
  • 隐式Sequence,在为主键定义AUTO_INCREMENT后,用于自动填充主键,由PolarDB-X自动维护。

支持的Sequence类型及其特性

PolarDB-X目前共支持如下4种Sequence类型:

类型(缩写) 全局唯一 连续 单调递增 同一连接内单调递增 非单点 数据类型 可读性 单元化能力
Group Sequence(GROUP) 所有整型
单元化 Group Sequence(GROUP) 所有整型
Time-based Sequence(TIME) 宏观上单调递增,微观上非单调递增 仅支持 BIGINT
Simple Sequence(SIMPLE) 所有整型

Group Sequence(GROUP,默认使用)

全局唯一的Sequence,产生的值是自然数序列,但是不保证连续和单调递增。如果未指定Sequence类型,PolarDB-X默认使用Group Sequence。

实现原理:采用多个节点产生值来保证高可用,每次取出一段值,如果该段值没有取完(比如连接断掉等情形),就会产生跳跃段。

  • 优点:全局唯一,不会产生单点问题,性能非常好。
  • 缺点:产生的序列不连续,可能会有跳跃段;不会严格从起始值开始取值;不能循环。

单元化 Group Sequence(GROUP)

以Group Sequence为基础,扩展了单元化能力,能够跨实例或跨库实现全局唯一,但同样不保证连续和单调自增。当单元化 Group Sequence仅配置一个单元时,等价于普通的Group Sequence。

  • 优点:具备Group Sequence的所有优点,且扩展了单元化能力。
  • 缺点:产生的序列不连续,可能会有跳跃段;不会严格从起始值开始取值;不能循环。

基本原理与Group Sequence相同;通过扩展参数选项,支持自定义单元数量和单元索引:

  • 单元数量决定了单元化 Group Sequence的全局唯一数字序列分配空间;
  • 每个单元(由单元索引指定)占用全局唯一数字序列分配空间中的一个子集;
  • 不同单元(指定了不同的单元索引)占用的子集之间不重叠(即不会分配相同的Sequence值);
  • 属于同一个全局唯一数字序列分配空间的每个单元化Group Sequence,必须指定相同的单元数量和不同的单元索引。


说明

单元化 Group Sequence从以下版本开始提供支持:

  • V5.2:V5.2.7-1606682(2018.4.27)
  • V5.3:V5.3.3-1670435(2018.8.15)

Time-based Sequence(TIME)

基于时间戳+节点编号+序列号组合而成的一种Sequence,保证全局唯一和宏观自增;这种Sequence值的更新不依赖于数据库,也不需要持久化到数据库,仅在数据库中保留名称和类型信息,性能很好;产生的是类似于776668092129345536、776668098018148352、776668111578333184、776668114812141568、......这样的序列值。

  • 优点:全局唯一、性能很好。
  • 缺点:产生的序列不连续,起始值、步长、最大值、是否循环这些参数对于Time-based Sequence无意义。


说明

  • 用于表中自增列时,必须使用BIGINT类型;
  • Time-based Sequence从以下版本开始提供支持:
    • V5.2:V5.2.8-15432885(2018.11.27)
    • V5.3:V5.3.6-15439241(2018.11.29)

Simple Sequence(SIMPLE)

仅Simple Sequence支持自定义步长、最大值和循环/非循环利用。

  • 优点:全局唯一、连续、单调递增,并具备最大值和循环利用等特性。
  • 缺点:单点,性能较差,存在瓶颈,需要谨慎使用。

每产生一个值都要进行一次持久化操作。

使用场景

这几种Sequence都保证全局唯一,均可以应用在主键列和唯一索引列。

  • 大部分场景下建议选用Group Sequence;
  • 如果有跨实例或跨库分配全局唯一数字序列的需求,可以选用单元化Group Sequence;
  • 如果业务上能接受整体趋势上的宏观自增,不介意微观上的不保证自增,且不想依赖数据库的分配机制,则Time-based Sequence可能是合适的选择;
  • 如果业务强依赖连续的Sequence值,此时只能使用Simple Sequence(注意Simple Sequence的性能问题)。

以创建一个起始值是100000,步长为1的Sequence为例说明。

  • 如果采用 Simple Sequence,则会严格产生100000、100001、100002、100003、100004、.....、200000、200001、200002、200003、......这样的序列(全局唯一、连续、单调递增)。Simple Sequence 会保证持久化,即使发生单点问题,服务重启后依然会在断点继续产生 Sequence 值,中间不会产生跳跃段。Simple Sequence 的机理是每产生一个值都要进行一次持久化操作,因此性能并不是很好。
  • 如果采用Group Sequence单元化 Group Sequence,产生的序列有可能是200001、200002、200003、200004、100001、100002、100003、......这样的序列。


说明

  • Group Sequence起始值并不会严格从设定的参数(本例中是100000)开始,但保证比该参数大。本例中是从200001开始取值的。
  • Group Sequence保证全局唯一,但是会有跳跃段。比如 roup Sequence的某个节点失效,或者某个连接只取了一部分值,然后该连接被关闭了,都会产生跳跃段。该例中200004和100001之间产生了跳跃段。
  • 单元化Group Sequence跨实例或跨库的全局唯一性,必须通过指定相同的单元数量和不同的单元索引来保证。
相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
相关文章
|
安全 前端开发 Java
Spring Security系列教程25--解决Spring Security环境中的跨域问题
前言 上一章节中,一一哥 给各位讲解了同源策略和跨域问题,以及跨域问题的解决方案,在本篇文章中,我会带大家进行代码实现,看看在Spring Security环境中如何解决跨域问题。 一. 启用Spring Security 的CORS支持 1. 创建web接口 我先在SpringBoot环境中,创建一个端口号为8080的web项目,注意这个web项目没有引入Spring Security的依赖包。然后在其中创建一个IndexController,定义两个测试接口以便被ajax进行跨域访问。 @RestController public class IndexController {
1168 1
|
存储 域名解析 供应链
阿里云 OSS对象存储攻防
本文分为两个部分 第一部分介绍OSS对象存储攻防的方式 第二部分为真实漏洞案例
2717 0
阿里云 OSS对象存储攻防
|
4月前
|
专有云 应用服务中间件 网络性能优化
HSF HSFServiceAddressNotFoundException案列分析
项目组在阿里专有云V3.12上运行,使用EDAS taobao-tomcat Pandora容器及HSF作为RPC框架。在HSF Consumer尝试调用Provider时出现`HSFServiceAddressNotFoundException`异常,提示找不到目标服务地址。经检查,HSF服务配置正确,但通过Pandora QOS进一步诊断发现Provider状态为invalid。此状态通常意味着Consumer无法访问到Provider,通过telnet验证了这一情况。问题根源在于Consumer和Provider间的HSF端口不匹配导致网络不通。
397 6
HSF HSFServiceAddressNotFoundException案列分析
|
7月前
|
NoSQL Linux Redis
Redis -- 安装客户端redis-plus-plus
Redis -- 安装客户端redis-plus-plus
381 0
|
7月前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(备份+恢复篇)(一)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(备份+恢复篇)
105 1
|
6月前
|
机器学习/深度学习 人工智能 弹性计算
阿里云GPU服务器租用费用_GPU服务器详解_A10、V100、T4、P4、P100
阿里云GPU云服务器提供NVIDIA A10、V100、T4、P4、P100等多种GPU卡,适合深度学习、科学计算等场景。实例性能强劲,单实例可达5PFLOPS混合精度计算,VPC网络支持2400万PPS和160Gbps内网带宽。GPU实例包括A10卡GN7i(3213.99元/月起)、V100-16G卡GN6v(3830.00元/月起)等,价格因配置而异。阿里云还提供GPU加速软件如AIACC-Training和AIACC-Inference,以及弹性计算实例EAIS。客户案例包括深势科技、流利说和小牛翻译等。
|
7月前
|
编解码 人工智能 语音技术
GPT-SoVits:刚上线两天就获得了1.4k star的开源声音克隆项目!效果炸裂的跨语言音色克隆模型!
GPT-SoVits:刚上线两天就获得了1.4k star的开源声音克隆项目!效果炸裂的跨语言音色克隆模型!
788 3
|
流计算
flink 单作业模式部署提交作业爆:Trying to access closed classloader. Please check if you store classloaders direc
flink 单作业模式部署提交作业爆:Trying to access closed classloader. Please check if you store classloaders direc
flink 单作业模式部署提交作业爆:Trying to access closed classloader. Please check if you store classloaders direc
|
7月前
|
缓存 关系型数据库 MySQL
postgresql|数据库|序列Sequence的创建和管理
postgresql|数据库|序列Sequence的创建和管理
158 0
|
消息中间件 大数据 数据挖掘
深入浅出流批一体理论篇,数据架构的演进
这篇文章的主要内容包括:1、数据架构的演变历史与各种架构的优缺点。2、流批一体的价值。3、流批一体架构中流与批的关系。
50121 74