随着互联网的高速发展,信息时代数据增速加快,为了缓解传统关系型数据库的单点压力以及处理能力,我们不得不考虑分布式架构,在此背景下为了记录数据的唯一性,往往需要一个全局唯一 ID,那我们如何获取呢?
方法一:UUID
UUID 是通用唯一识别码 (Universally Unique Identifier),在其他语言中也叫 GUID ,可以生成一个长度 32 位的全局唯一识别码。为了保证 UUID 的唯一性,规范定义了包括网卡MAC 地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成 UUID 的算法。UUID 的复杂特性在保证了其唯一性的同时,意味着只能由计算机生成。
String uuid = UUID.randomUUID().toString()
结果示例:
81659cd9-c8fb-47bb-9706-f74935cca0dd
UUID 虽然可以保证全局唯一,但是占用 32 位有些太长,而且是无序的,入库时性能比较差。
为什么无序的 UUID 会导致入库性能变差呢?
这就涉及到 B+ 树索引的分裂:
众所周知,关系型数据库的索引大都是 B+ 树的结构,拿 ID 字段来举例,索