生成唯一订单号_人人皆知却暗藏玄机的“数据库唯一标识符”

Hello 大家好,今天给大家讲一个几乎所有数据库都支持的特性: 生成唯一标识符。
知乎视频​www.zhihu.com

详细内容:

唯一标识符应用场景非常多,比如网站注册时自动给新用户一个唯一 ID,给每一个订单/生成一个订单号,给每一笔支付/生成支付流水号,等等。

在 MySQL 中,用自增列来/来生成唯一标识,在 Oracle 中用 Sequence 来生成唯一标识。后来呢,Oracle 受 MySQL 的启发,在表定义阶段就能把一个 equence 和表的一列绑定,称这一列为 identity column,能自动生成递增序列。

812c34faf88994086eaa9067f6279c75.png

这里有一个有趣的细节值得我们注意:MySQL 自增列的命名里强调“自增”。在 MySQL 里,如果主动插入一个比自增值更大的值 X,那么随后/自动生成的自增值/都会比 X 大。这是一个很赞的特性,特别是在分布式场景下,DBA 只要插入一个足够大的值,就可以很容易地丢弃/所有机器上/比他小的所有序列,不用很麻烦地去每台机器上人工做刷新。

170e0e752fded9b6b73279833a80ca0d.png

单机数据库中,实现这个特性非常简单,但在分布式数据库场景下,实现起来就比较麻烦了,每主动插入一个更大的自增值,就需要同步到所有服务器。在高负载场景中,这可能会压垮整个集群。

所以,在分布式数据库场景下,出于性能考虑,一个务实的数据库就不会那么强调 “增” ,而会强调 “唯一”,只要在每一个服务器上缓存不同的数据区段,就可以保证在任意服务器上取得的值一定是全局唯一的。

a6174b4b590ee70530225e111f829adb.png

Oracle 中,用下面的create sequence SQL 语句来定义这样的用法 :

4ff32e4023bbd6e240082141ff560158.png

因为它并不强调递增,而是强调 “唯一标识”,所以实现简单,性能优异。如果用户要求全局有序递增,只需在创建 SEQUENCE 时指定 ORDER 属性即可,此时扩展性较差,机器数只能在20台左右,再大性能就非常差了。

在分布式场景下,如果用户就是需要全局按顺序递增,那该怎么办呢?其实也没有黑魔法,只能是利用一个单点来产生有序数据,供给多台机器取用,网络通信不可避免。

OceanBase 已经支持自增列、sequence 两种生成唯一标识符的方法,identity column 将在 OceanBase 未来的版本中推出。欢迎体验!

992955a8cd358e8525742e78d303702a.png

欢迎关注“OB小话唠”视频号,最新分布式数据库技术,一起絮絮叨叨~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值