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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/19668.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符串匹配算法(三)Trie树算法

文章目录 Trie树的简介Trie树定义Trie树的实现 代码实现 Trie树的简介 Trie树定义 Trid树,也叫”字典树“。它是一个树形结构。专门处理字符串匹配的数据结构,用来解决字符串集中快速查找某个字符串的问题。 Trie 树的本质,就是利用字符串之…

LeetCode503:下一个更大元素Ⅱ

题目描述 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这…

记录一次云服务器无法连接的排查过程

运行环境:阿里云服务器 故障外显原因:登录失败,操作系统禁用了密码登录方式 控制台监控数据显示云盘读写BPS拉满了 因为之前问过线上售后,让安装了atop监控,,所以先打开atop日志: atop -r /var/log/atop…

自动驾驶中的长尾问题

自动驾驶中的长尾问题 定义 长尾问题(Long-Tail Problem)是指在数据分布中,大部分的数据集中在少数类别上,而剩下的大多数类别却只有少量的数据。这种数据分布不平衡的现象在许多实际应用中广泛存在,特别是在自动驾驶…

音视频开发—H265相关概念和压缩原理详解(GOP、宏块、帧内压缩、帧间压缩)

文章目录 1.什么是GOP?1.1 GOP介绍1.2.GOP中I帧/B帧/P帧1.3.I帧和IDR的区别联系I帧(Intra Frame)IDR帧(Instantaneous Decoding Refresh Frame)区别总结 1.4 帧与分组的关系1.5 SPS与PPSSPS(Sequence Param…

【前端视野下的数据库概念探秘】——信息化人员必备知识面试宝典:解码“视图”与“游标”

【前端视野下的数据库概念探秘】——信息化人员必备知识&面试宝典:解码“视图”与“游标” 视图:数据的魔法透镜基本概念前端为何关心?代码示例:案例一功能使用思路 游标:数据流的指针基础认知前端视角代码示例&am…

竹纤维家装元宇宙:虚拟空间与绿色生活的融合

在全球化和科技迅速发展的今天,元宇宙作为一种全新的互联网应用和社会形态,正逐步渗透到人们生活的各个方面。特别是在家装行业,竹纤维作为一种新型环保材料,结合元宇宙的概念,正在引领一场绿色生活的革命。 ### 一、…

6.5 Go 指针

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

beamer修改超链接颜色报错

beamer修改超链接颜色报错 使用 \usepackage[colorlinkstrue, urlcolorblue]{hyperref} % 只将超链接设置为蓝色设置 url颜色时、会报错 这是因为在使用 LaTeX 的 Beamer 类创建演示文稿时, Beamer 自身已经自动加载了 hyperref 宏包,并对其进行了一些…

EasyExcel之动态表头导出不生效

今天接到一个优化需求,表格导出后的表头顺序和页面不一致,要优化成一致的。根据传入的字段,动态导出数据,并保证顺序。 我看到导出的实体类都有ExcelProperty注解,同时也在官网查看了这注解的含义和使用。 ExcelPrope…

如何在Linux系统中搭建Zookeeper集群

一、概述 ZooKeeper是一个开源的且支持分布式部署的应用程序,是Google的Chubby一个开源的实现;它为分布式应用提供了一致性服务支持,包括:配置维护、域名服务、分布式同步、组服务等。 官网:https://zookeeper.apach…

3D轻量化的三大应用解决方案

老子云平台https://www.laozicloud.com/ 为不同应用场景提供了三大解决方案。 01 单模型轻量化解决方案 数字化时代,越来越多的C2M定制、文旅、电商等行业,为了开拓市场,提升企业竞争力,开始把目光投向产品的3D展示交互。 单模…

ADuM1201可使用π121U31间接替换π122U31直接替换

ADuM1201可使用π121U31间接替换π122U31直接替换 一般低速隔离通信150Kbps电路可使用π121U31,价格优势较大。速度快的有其它型号可达10M,200M,600M。 本文主要介绍ADUM1201,替换芯片π121U31简单资料请访问下行链接 只要0.74元的双通道数字隔离器,1T1…

一个程序员的牢狱生涯(48)男人

星期一 男人 无论发生了什么事,看守所的一切都在按部就班的进行着,墙上的电视在晚上七点钟的时候准时打开,到了所有的号子集体收看“新闻联播”的时间。 号子里除了小x州站在厕所门口没有动外,其他人都安静地做回自己的位置,同样是坐班的姿势,只不过不用‘自我反省’,不…

【字典树(前缀树) 哈希映射 后序序列化】1948. 删除系统中的重复文件夹

本文涉及知识点 字典树(前缀树) 哈希映射 后序序列化 LeetCode 1948. 删除系统中的重复文件夹 由于一个漏洞,文件系统中存在许多重复文件夹。给你一个二维数组 paths,其中 paths[i] 是一个表示文件系统中第 i 个文件夹的绝对路径的数组。 …

xmake+xrepo自建仓库添加交叉编译工具链

xmakexrepo自建仓库添加交叉编译工具链 最近想将交叉编译工具链放到xrepo自建仓库中,在xmake中引用,方便多个电脑快速实现交叉编译。 xmake官方文档感觉不够详细,折腾了好久,这里做个记录。 基本步骤如下: 添加自建…

13.优化界面化的游戏辅助

12.使用mfc实现游戏辅助的界面 在它的代码上进行修改 12.使用mfc实现游戏辅助的界面它的代码是频繁读写游戏的内存,这样不是很好,下面的代码是在它的基础上进行了封装,控制无敌的逻辑在我们申请的内存中实现(也就是在一个全局中实…

C语言数组指针和指针数组

在C语言中,“数组指针”和“指针数组”是两个不同的概念,尽管名字相似,但它们的用途和用法有明显的区别。下面我们详细解释一下这两个概念。 ### 数组指针 (Pointer to an Array) 数组指针是指向一个数组的指针。它保存的是数组的地址。假设…

小程序项目创建与Vant-UI引入

一,创建小程序项目 AppID可先用测试号; 模板来源选择 ’全部来源‘ ,’基础‘ 。模板一定JS开头的; vant-weapp 官网 vant-Weapp 二,下载vant-weapp 组件 1,在新项目中打开 ’调试器‘; 2…

前端Vue小兔鲜儿电商项目实战Day03

一、Home - 整体结构搭建和分类实现 1. 页面结构 ①按照结构新增5个组件&#xff0c;准备最简单的模板&#xff0c;分别在Home模块的入口组件中引入 src/views/Home/components/ HomeCategory.vue HomeBanner.vue HomeNew.vue HomeHot.vue HomeProduct.vue <script …