Hello 大家好,今天给大家讲一个几乎所有数据库都支持的特性: 生成唯一标识符。知乎视频www.zhihu.com
详细内容:
唯一标识符应用场景非常多,比如网站注册时自动给新用户一个唯一 ID,给每一个订单/生成一个订单号,给每一笔支付/生成支付流水号,等等。
在 MySQL 中,用自增列来/来生成唯一标识,在 Oracle 中用 Sequence 来生成唯一标识。后来呢,Oracle 受 MySQL 的启发,在表定义阶段就能把一个 equence 和表的一列绑定,称这一列为 identity column,能自动生成递增序列。
这里有一个有趣的细节值得我们注意:MySQL 自增列的命名里强调“自增”。在 MySQL 里,如果主动插入一个比自增值更大的值 X,那么随后/自动生成的自增值/都会比 X 大。这是一个很赞的特性,特别是在分布式场景下,DBA 只要插入一个足够大的值,就可以很容易地丢弃/所有机器上/比他小的所有序列,不用很麻烦地去每台机器上人工做刷新。
单机数据库中,实现这个特性非常简单,但在分布式数据库场景下,实现起来就比较麻烦了,每主动插入一个更大的自增值,就需要同步到所有服务器。在高负载场景中,这可能会压垮整个集群。
所以,在分布式数据库场景下,出于性能考虑,一个务实的数据库就不会那么强调 “增” ,而会强调 “唯一”,只要在每一个服务器上缓存不同的数据区段,就可以保证在任意服务器上取得的值一定是全局唯一的。
Oracle 中,用下面的create sequence SQL 语句来定义这样的用法 :
因为它并不强调递增,而是强调 “唯一标识”,所以实现简单,性能优异。如果用户要求全局有序递增,只需在创建 SEQUENCE 时指定 ORDER 属性即可,此时扩展性较差,机器数只能在20台左右,再大性能就非常差了。
在分布式场景下,如果用户就是需要全局按顺序递增,那该怎么办呢?其实也没有黑魔法,只能是利用一个单点来产生有序数据,供给多台机器取用,网络通信不可避免。
OceanBase 已经支持自增列、sequence 两种生成唯一标识符的方法,identity column 将在 OceanBase 未来的版本中推出。欢迎体验!
欢迎关注“OB小话唠”视频号,最新分布式数据库技术,一起絮絮叨叨~