主键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更安全。

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

相关推荐
这个DBA有点耶24 分钟前
为什么删掉索引后,查询瞬间变快了?探讨MySQL的随机I/O与顺序I/O博弈
数据库·mysql·代码规范
kingx31 小时前
BugKu 渗透测试 4 实战:文件上传打点,5 Flag 全通
数据库·渗透测试·web·内网渗透
我命由我123452 小时前
Python 实用操作 - 文件操作(打开与关闭文件、读取文件、文件写入)
java·开发语言·前端·javascript·数据库·python·java-ee
SelectDB2 小时前
Apache Doris 与 SelectDB 是什么关系?从开源技术到面向 Agent 的极速分析数据库
大数据·数据库·数据分析
VimorphTech2 小时前
文本已经改了,旧的音频生成结果还能回写吗?
java·数据库·mybatis
SelectDB2 小时前
存算分离冷查询提速 7.5 倍!Apache Doris 4.2 Peer Read 实现跨计算组缓存复用
大数据·数据库·数据分析
盛世宏博智慧档案2 小时前
一站式智慧档案解决方案,如何实现防火防盗漏水多维度安全监测实践
服务器·网络·数据库
GreatSQL2 小时前
GreatSQL 8.0回流MySQL 5.7主从复制中断分析排查过程
mysql
数据库小学妹2 小时前
MySQL磁盘IO瓶颈:iostat与刷脏fsync
数据库·mysql·性能优化
三兔测序学社3 小时前
【零代码生信分析】RNA-seq中级分析11-差异基因进行222种不同类型数据库基因集之间的富集分析
数据库