主键UUID和数据库自增ID怎么选择?

一、前言

最近在建表选择主键的时候有些纠结,我们经常使用的主键有两种UUID和自增ID,不知道选哪一种好。之前一直没有总结过这两种主键的区别,于是今天去总结了一下这两种主键的区别、优缺点,以便为我们以后主键选择提供一些参考。

二、自增ID

自增ID就是由数据库引擎负责生成主键ID,实现和使用都很简单,几乎所有的数据库都原生支持。

优点:

  1. 存储空间:ID是数字,占用存储空间比UUID(UUID通常是128位,自增ID一般是32位或64位)少。
  2. **查询效率高:**由于ID是自增的,可在一定程度上提高插入和查询的性能,尤其是在索引上的表现更好。
  3. **方便展示:**ID比较短,方面在页面上直接展示。
  4. **方便分页:**ID是连续自增的,所以在分页的时候,可以通过ID解决深度分页的问题。

缺点:

  1. **可能用完:**自增ID可能是int或bigint,无论是那种都有可能会用完。
  2. **可预测性:**由于ID是自增的,可以根据ID预测我们的业务量,可能会存在一定的安全风险。
  3. **分库分表:**当我们的系统做分库分表时,就不能用自增ID了,会导致ID重复。我们就需要采用额外的机制来保证ID的唯一性(如分布式ID生成器)。

三、UUID

UUID是一个128位长的唯一标识符,通常是字符串形式表现。

优点:

  1. **全局唯一:**UUID有很多版本,使用不同的算法生成。几乎可以保证全局唯一,可以确保在分布式系统中不会冲突。
  2. **不可预测性:**UUID是随机生成的,不容易猜测,能够提供一定的隐私保护。
  3. **去中心化:**不需要依赖一个统一的中间件,就能生成唯一的ID,非常适合分布式系统。

缺点:

  1. **存储空间:**UUID以字符串形式存储,前面提到过通常是128位,占用的存储空间大。
  2. **可读性差:**UUID较长且复杂,没有任何业务含义,不方便阅读,不方便在页面上展示。
  3. **不适合做范围查询:**UUID不是自增的,在做范围查询的时候不支持。
  4. 查询效率低:

a).UUID作为主键,因为长度很长,索引就会变得很大,会占用更多的磁盘空间,进而增加磁盘IO。并且,大索引还会导致查询时内存开销增加。

b). 使用UUID进行排序时,新的UUID通常会插入到叶子节点的中间位置。这可能会导致B+树的分裂和平衡操作频繁进行,增加了插入的开销。每次分裂或平衡都涉及到数据的重新排序,从而影响查询性能。

四、选择依据

通过上面的总结,我们可以根据下面几点来选择主键。

  • 系统规模和复杂度:如果时单体应用或小规模系统,自增ID可能是更好的选择。如果是大规模的分布式系统,UUID会跟适合。
  • 性能要求:如果对系统性能要求很高,特别是涉及到大量的写操作和读操作,选择自增ID会更优。
  • 唯一性需求:如果系统需要保证ID全局唯一,或需要在多个数据库之间进行数据整合,则UUID更合适。
  • 安全性要求:如果需要防止ID被推断,防止被预测业务量,选择UUID更安全。

需要综合考虑这些因素,根据具体的应用场景选择合适的主键类型。

相关推荐
Hello.Reader1 小时前
Redis热点数据管理全解析:从MySQL同步到高效缓存的完整解决方案
redis·mysql·缓存
是程序喵呀1 小时前
MySQL备份
android·mysql·adb
指尖上跳动的旋律2 小时前
shell脚本定义特殊字符导致执行mysql文件错误的问题
数据库·mysql
一勺菠萝丶2 小时前
MongoDB 常用操作指南(Docker 环境下)
数据库·mongodb·docker
lucky_syq2 小时前
Hive SQL和Spark SQL的区别?
hive·sql·spark
m0_748244833 小时前
StarRocks 排查单副本表
大数据·数据库·python
C++忠实粉丝3 小时前
Redis 介绍和安装
数据库·redis·缓存
wmd131643067123 小时前
将微信配置信息存到数据库并进行调用
数据库·微信
是阿建吖!3 小时前
【Linux】基础IO(磁盘文件)
linux·服务器·数据库
凡人的AI工具箱3 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite