【MySQL】mysql中不推荐使用uuid或者雪花id作为主键的原因以及差异化对比

文章目录

      • 前言
      • 什么是UUID?
      • 什么是雪花ID?
      • 什么是MySql自增ID?
      • 优缺点对比
        • UUID:
          • 优点
            • 1.全球唯一性
            • 2.无需数据库支持
          • 缺点
            • 1.存储空间大
            • 2.索引效率低
            • 3.查询效率低
        • 雪花ID:
          • 优点
            • 1.分布式环境下唯一性
          • 缺点
            • 1.依赖于机器时钟
            • 2.存储空间较大
            • 3.查询效率低
        • MYSQL自增:
          • 优点
            • 1.简单易用
            • 2.唯一性
            • 3.效率高
            • 4.索引效率高
          • 缺点
            • 1.不适用于分布式系统
            • 2.不适用于需要保密的场景
            • 3.查询效率低
      • 应用场景
        • UUID应用场景
          • 1.分布式系统
          • 2.高并发环境
          • 3.需要保密的场景
        • 雪花ID应用场景
          • 1.分布式系统
          • 2.高并发环境
        • MySQL自增ID应用场景
          • 1.单机系统
          • 2.高效查询
          • 3.索引效率高
      • 总结
      • 写在最后

579a429daf314744b995f37351b46548

前言

在数据库设计中,选择适当的主键类型对于数据的存储和查询效率至关重要。在MySQL中,有些开发者倾向于使用UUID(Universally Unique Identifier)或者雪花ID作为主键,以确保数据的唯一性。然而,这种做法并不总是推荐的,因为它们在性能、存储空间和索引效率等方面存在一些问题。本文将探讨在MySQL中不推荐使用UUID或者雪花ID作为主键的原因,并与其他主键类型进行差异化对比。


什么是UUID?

UUID(Universally Unique Identifier)是一种标识符,用于在计算机系统中唯一地标识实体。它是一个128位的数字,通常以32个十六进制数字的形式表示,中间用连字符分隔。UUID的生成算法保证了在理论上不同计算机和不同时间生成的UUID都是唯一的。

UUID的唯一性和广泛应用使得它在分布式系统、数据库、网络通信等领域得到广泛使用。它可以用于标识数据库记录、文件、消息、会话等各种实体,确保它们在不同的系统和时间下都能够被唯一标识。


什么是雪花ID?

雪花ID(Snowflake ID)是一种分布式唯一ID生成算法,由Twitter公司开发。它的设计目标是在分布式系统中生成全局唯一的ID,以解决传统自增ID在分布式环境下可能出现的冲突和性能瓶颈问题。

雪花ID的结构如下:

  1. 符号位(1位):始终为0,表示正数。
  2. 时间戳(41位):记录生成ID的时间戳,精确到毫秒级。
  3. 数据中心ID(5位):用于标识数据中心,最多支持32个数据中心。
  4. 机器ID(5位):用于标识机器,最多支持每个数据中心32台机器。
  5. 序列号(12位):每个节点在同一毫秒内生成的序列号,最多支持每毫秒生成4096个ID。

通过将时间戳、数据中心ID、机器ID和序列号组合在一起,雪花ID可以在分布式系统中生成全局唯一的ID。由于时间戳占据了较高的位数,所以雪花ID生成的ID是递增的,可以保证在一定程度上的有序性。


什么是MySql自增ID?

MySQL自增ID是一种由MySQL数据库管理系统提供的主键生成机制。它通过自动递增的方式为每条插入的记录生成一个唯一的ID值,用于标识该记录在表中的唯一性。

在MySQL中,自增ID通常与整数类型的列(如INT或BIGINT)结合使用。当插入一条新记录时,MySQL会自动为该列生成一个唯一的ID值,下一次插入时会自动递增。这样可以确保每条记录都有一个唯一的标识符,方便进行数据的查找、更新和删除操作。


优缺点对比

UUID:
优点
1.全球唯一性

​ UUID在全球范围内保证了唯一性,不会出现重复的情况。

2.无需数据库支持

​ UUID的生成不依赖于数据库,可以在应用层生成。

缺点
1.存储空间大

​ UUID占用的存储空间较大,通常为36个字符,如果作为主键,会占用更多的存储空间。

2.索引效率低

​ UUID是随机生成的,不具有顺序性,导致索引效率较低。

3.查询效率低

​ 由于索引效率低,查询效率也会受到影响。

雪花ID:
优点
1.分布式环境下唯一性

​ 雪花ID在分布式系统中生成唯一的ID,可以满足分布式环境下的需求。

缺点
1.依赖于机器时钟

​ 雪花ID的生成依赖于机器的时钟,如果时钟回拨或者时钟不同步,可能会导致生成的ID不唯一。

2.存储空间较大

​ 雪花ID占用的存储空间较大,通常为64位,如果作为主键,会占用更多的存储空间。

3.查询效率低

​ 由于雪花ID是随机生成的,不具有顺序性,导致索引效率较低。

MYSQL自增:
优点
1.简单易用

​ MySQL自增ID的生成由数据库自动完成,无需额外的代码逻辑。

2.唯一性

​ 自增ID保证了每条记录都有一个唯一的标识符。

3.效率高

​ 自增ID是按顺序递增的,可以提高插入和查询的效率。

4.索引效率高

​ 自增ID可以作为主键或索引列,提高查询效率。

缺点
1.不适用于分布式系统

​ 在分布式环境下,多个节点生成的自增ID可能会冲突,需要额外的处理机制。

2.不适用于需要保密的场景

​ 自增ID的递增规律可能暴露系统的使用情况,不适用于需要保密的业务场景。

3.查询效率低

​ 由于雪花ID是随机生成的,不具有顺序性,导致索引效率较低。

综上所述,虽然UUID和雪花ID在某些场景下具有唯一性和分布式支持的优点,但由于存储空间大、索引效率低等缺点,以及不适用于分布式和保密场景,不推荐将它们作为主键。相比之下,MySQL自增ID具有简单易用、唯一性、效率高和索引效率高等优点,适用于大多数场景,因此推荐使用自增ID作为主键。


应用场景

UUID应用场景
1.分布式系统

​ 由于UUID的全球唯一性,可以在分布式系统中生成唯一的标识符,避免冲突。

2.高并发环境

​ UUID的生成不依赖于数据库,可以在应用层生成,减少数据库的压力。

3.需要保密的场景

​ UUID是随机生成的,不具有递增规律,适用于需要保密的业务场景。

雪花ID应用场景
1.分布式系统

​ 雪花ID可以在分布式系统中生成唯一的ID,满足分布式环境下的需求。

2.高并发环境

​ 雪花ID的生成不依赖于数据库,可以在应用层生成,减少数据库的压力。

MySQL自增ID应用场景
1.单机系统

​ MySQL自增ID适用于单机系统,由数据库自动生成,简单易用。

2.高效查询

​ 自增ID是按顺序递增的,可以提高插入和查询的效率。

3.索引效率高

​ 自增ID可以作为主键或索引列,提高查询效率。

综上所述,UUID适用于分布式系统和需要保密的场景,雪花ID适用于分布式系统和高并发环境,MySQL自增ID适用于单机系统和高效查询的场景。根据具体的业务需求和系统架构,选择合适的主键类型。


总结

选择适当的主键类型对于数据库的性能和可扩展性至关重要。

在MySQL中,使用自增整数作为主键是一种常见的做法,因为它具有较小的存储空间、高效的索引和自动增长的特性。

相比之下,使用UUID或者雪花ID作为主键可能会导致性能下降、存储空间浪费和索引效率降低等问题。

然而,具体选择何种主键类型还是要根据具体的业务需求和数据特点来决定。

通过本文的介绍和对比,希望读者能够更好地理解在MySQL中不推荐使用UUID或者雪花ID作为主键的原因,并能够根据实际情况做出明智的选择。


写在最后

感谢您的支持和鼓励! 😊🙏

如果大家对相关文章感兴趣,可以关注公众号"架构殿堂",会持续更新AIGC,java基础面试题, netty, spring boot, spring cloud等系列文章,一系列干货随时送达!

csdn-end

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

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

相关文章

IP 代理的基础知识有哪些?

本文将介绍流冠IP代理的基础知识,帮助您了解IP代理的概念、类型、作用、设置方法和注意事项。 一、IP代理的概念 IP代理是一种网络代理服务,它通过代理服务器帮助用户访问互联网,并将用户的请求转发到目标网站,同时将目标网站的响…

手写工作流设计模式,针对常见的工作流步骤流转,减少过多的if/else,提升编程思维

需求 这一年下来,写两次工作流流转,总结下经验。 第一次写的时候,只找到用模版设计模式包裹一下,每个方法都做隔离,但是在具体分支实现的时候,if/else 满屏分,而且因为要针对不同情况&#xff…

微信小程序实现类似Vue中的computed、watch功能

微信小程序实现类似Vue中的computed、watch功能 构建npm使用 构建npm 创建包管理器 进入小程序后,打开终端,点击顶部“视图” - “终端” 新建终端 使用 npm init -y初始化包管理器,生成一个package.json文件 安装 npm 包 npm install --…

Java Web 实战 21 - 用 Servlet 实现一个Hello World

用 Servlet 来写一个 Hello World~ 一 . 基本部署方式1.1 创建 Servlet 项目1.2 引入依赖1.3 创建目录1.4 编写代码继承 HttpServlet重写 doGet 方法删除 super 方法加上 WebServlet 注解写业务逻辑 1.5 打包1.6 部署1.7 验证1.8 小结 二 . 更方便的部署方式2.1 Smart Tomcat 的…

本地部署 ComfyUI

本地部署 ComfyUI ComfyUI 介绍ComfyUI Github 地址部署 ComfyUI配置模型地址 or 下载模型启动 ComfyUI访问 ComfyUI ComfyUI 介绍 最强大、模块化的稳定扩散 GUI 和后端。 该用户界面将允许您使用基于图形/节点/流程图的界面设计和执行高级稳定扩散管道。 ComfyUI Github 地…

第五天 用Python批量处理Excel文件,实现自动化办公

用Python批量处理Excel文件,实现自动化办公 一、具体需求 有以下N个表,每个表的结构一样,如下: 需要把所有表数据汇总,把每个人的得分、积分分别加起来,然后按总积分排名,总积分一致时&#xff…

小程序可拖拽按钮

你有没有遇到过在页面中有一个固定在某个位置的按钮,永远的挡住了你想要看的区域? 在小程序的列表页面中,常常会有一个提报的入口固定在右下角,如果这个按钮不可拖动的话,可能会挡住下面的事件,让用户操作起…

云端导览,数字互动 | 拓世法宝AI数字人一体机助力全新旅游时代

《中国旅行消费趋势洞察白皮书(2023版)》显示,消费者旅行习惯已从“到此一游”变为“深度在地”,更强调在旅游中充实自我、学习新知识。 (《中国旅行消费趋势洞察白皮书(2023版》截图) 从这些资…

Springboot整合MybatisPlus及分页功能

1 引入pom <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot</artifactId><version>2.7.14</version> </dependency> <dependency><groupId>com.baomidou</groupId><a…

【Vue】Vue3 配置全局 scss 变量

variables.scss $color: #0c8ce9;vite.config.ts // 全局css变量css: {preprocessorOptions: {scss: {additionalData: import "/styles/variables.scss";,},},},.vue 文件使用

Java大型电商项目——品优购(一)

视频教程&#xff1a;【黑马程序员】Java大型电商项目—品优购【配套源码笔记】_哔哩哔哩_bilibili源码下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1fECz5In_XCB-aW6ed6ZTbA 提取码&#xff1a;27xa 技术选型&#xff1a; 后端框架&#xff1a;SpringSprin…

多功能回馈式交流电子负载的应用

多功能回馈式交流电子负载是用于模拟和测试电源、电池等电子设备的负载工具。它具有多种应用&#xff0c;可以用于测试和评估各种类型的电源&#xff0c;包括直流电源和交流电源。它可以模拟各种负载条件&#xff0c;如恒定电流、恒定电压和恒定功率&#xff0c;以验证电源的性…

小叶子钢琴智能陪练 助力打牢钢琴基础

孩子在练琴过程中&#xff0c;经常会出现错音错节奏&#xff0c;为了能够帮助她更高效的练琴&#xff0c;最近开始使用智能钢琴陪练工具——小叶子钢琴智能陪练。 身边也有很多朋友在用这款应用&#xff0c;它比较知名的功能就是三大练琴模式&#xff0c;也就是识谱模式、提升…

java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案 小程序商城免费搭建

使用技术&#xff1a; Spring CloudSpring BootMybatis微服务服务监控可视化运营 B2B2C平台&#xff1a; 平台管理端(包含自营) 商家平台端(多商户入驻) PC买家端、手机wap/公众号买家端 微服务&#xff08;30个通用微服务如&#xff1a;商品、订单、购物车、个人中心、支…

Ubuntu20.04清理垃圾vscode缓存

使用VM虚拟机安装了Ubuntu系统&#xff0c;主目录空间越来越小&#xff0c;硬盘扩容之后很快又空间不足&#xff0c;甚至出现了开机卡黑屏的情况&#xff0c;这里记录一下解决过程。 1 重新开机进入系统 状态&#xff1a;卡到了开机黑屏状态&#xff0c;左上角有一条小横杠 原…

国外网站文章或网页采集翻译为中文

采集国外网站的文章或网页数据&#xff08;例如英文&#xff0c;西班牙语&#xff0c;法语等&#xff09;&#xff0c;怎么快速批量翻译为中文&#xff1f; 可以使用简数采集器来实现&#xff0c;支持自动翻译&#xff0c;同时翻译为多种语言&#xff08;不仅中文&#xff09;…

Linux实验三:shell程序设计: shell基础

实验目的: 进一步巩固shell程序设计语言基本语法&#xff0c;加深对所学知识理解。 实验要求 1. 四种变量的使用 2. 配置环境变量 3. 元字符和正则表达式 4. 引号 1. 本地变量 $ var1"hello Linux" //定义本地变量var1 $ read var2 //定义本地变量vae…

Linux常用命令——blkid命令

在线Linux命令查询工具 blkid 查看块设备的文件系统类型、LABEL、UUID等信息 补充说明 在Linux下可以使用blkid命令对查询设备上所采用文件系统类型进行查询。blkid主要用来对系统的块设备&#xff08;包括交换分区&#xff09;所使用的文件系统类型、LABEL、UUID等信息进行…

【linux】服务器CPU占用50%,top/htop/ps却看不到异常进程?使用unhide可以查看!

问题描述 htop发现前32个核全被占满了&#xff0c;但是却找不到对应进程号 查杀 安装unhide查看隐藏进程 apt-get install unhideunhide使用 unhide proc果然发现了隐藏进程 杀死隐藏进程 kill -9 [pid]这么多pid号&#xff0c;我这边杀了其中一个&#xff0c;发现CPU…

本地websocket服务端暴露至公网访问【cpolar内网穿透】

本地websocket服务端暴露至公网访问【cpolar内网穿透】 文章目录 本地websocket服务端暴露至公网访问【cpolar内网穿透】1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功…