UUID 与 自增ID

175 阅读2分钟

自增ID

自增ID的赋值一般由数据库实现,有以下优点:

  • 生成的主键是有顺序的,每次新插入的数据都在最后,这对性能是一个巨大的提升,会减少很多B+Tree的分裂,(详见B+Tree的插入实现)
  • 占用空间小,主键长度短,利于检索

缺点也很明显:

  • 容易被人知道业务量

  • 必须得在持久化的时候才能赋值

  • 遇到手动赋予主键的情况很麻烦

  • 没有提供任何关于记录的信息

  • 高并发时,自增主键会导致竞争锁冲突的问题

UUID

UUID是通用唯一识别码(Universally Unique Identifier),能够保证在一定范围内唯一性

优点是:

  • 全局唯一性
  • 含有如创建时间之类的信息
  • 在数据迁移的时候,不会有主键冲突

缺点在于:

  • 占用空间大,一个完整的UUID占用128字节

  • 长度长,检索效率低

  • 无序,插入效率低

使用场景

  • 可以看出,自增ID有很大的限制,但对于性能的提升是很大的,适用于数据量多,插入、检索频繁,建立索引多的情况。
  • 而UUID最大的缺点就是占用资源多,无论是时间还是空间,但自身富含信息,限制小,适合数据量小,需要保证全局唯一的场景。
  • 而在DDD场景中,持久化实例之后才返回实例的唯一标识,是十分致命的: 由于领域事件先于持久化发布,此时事件中的数据是不包含实例的唯一标识的,会导致订阅领域事件方认为所有实体都是一个实体。
  • 所以在DDD设计中一般使用UUID。