【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.hqwc.cn/news/213216.html

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

相关文章

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

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

运放如何进行全波整流

对于一个双极性的交流信号,如果想要把负半轴的信号镜像到正半轴,我们可以接一个整流桥,这种叫做全波整流。 如果双极性的交流信号经过一个二极管,则交流信号的负半轴不能通过二极管,输出只有正半轴的信号,这…

010 OpenCV中的4种平滑滤波

目录 一、环境 二、平滑滤波 2.1、均值滤波 2.2、高斯滤波 2.3、中值滤波 2.4、双边滤波 三、完整代码 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、平滑滤波 2.1、均值滤波 在OpenCV库中,blur函数是一种简…

【SpringMVC】 三层架构

一.lombok工具包 中央仓库查找这个工具包:https://mvnrepository.com/ 给类添加Data注解就可以获取gettter和setter方法 , 这样我们就不必写getter 和 setter 方法. 也可以给成员属性添加单独的getter 和 setter , 针对某个成员属性单独添加setter或setter方法. 二.如果使用spr…

ET-Net:一种用于医学图像分割的通用边缘保持引导网络

ET-Net: A Generic Edge-aTtention Guidance Network for Medical Image Segmentation ET-Net:一种用于医学图像分割的通用边缘保持引导网络背景贡献实验方法Edge Guidance Module(边缘引导模块)Weighted Aggregation Module(加权…

物联网AI MicroPython学习之语法 I2S音频总线接口

学物联网,来万物简单IoT物联网!! I2S 介绍 模块功能: I2S音频总线驱动模块 接口说明 I2S - 构建I2S对象 函数原型:I2S(id, sck, ws, sd, mode, bits, format, rate, ibuf)参数说明: 参数类型必选参数&#xff1f…

设计山寨枚举

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 一个需求 在Employee类…

【c语言】重温一下动态内存,int数组过大会造成栈错误

项目场景: 项目场景:互助群同学在刷题的过程中,遇到的一个题目,需要申请一个很大数组,于是这个同学就写了int[1000000],其实这样写也没有错,可是运行后却显示栈错误。于是就找到我来请教,我想就…

Spark-06:共享变量

目录 1.广播变量(broadcast variables) 2.累加器(accumulators) 在分布式计算中,当在集群的多个节点上并行运行函数时,默认情况下,每个任务都会获得函数中使用到的变量的一个副本。如果变量很…

123. 股票买卖的最佳时机III(2次交易)

题目 题解 class Solution:def maxProfit(self, prices: List[int]) -> int:N len(prices)# 状态定义 dp[i][j][k]代表在第i天,被允许完成j次交易时,持有或者不持有的最大利润。k0代表不持有,k1代表持有dp [[[0 for k in range(2)] for…

分布式锁之基于mysql实现分布式锁(四)

不管是jvm锁还是mysql锁,为了保证线程的并发安全,都提供了悲观独占排他锁。所以独占排他也是分布式锁的基本要求。 可以利用唯一键索引不能重复插入的特点实现。设计表如下: CREATE TABLE tb_lock (id bigint(20) NOT NULL AUTO_INCREMENT,…

数据防泄漏系统有什么作用及优势?

数据防泄漏系统(Data Loss Prevention,简称DLP)是一种重要的信息安全解决方案,旨在防止敏感数据被未经授权地泄露、滥用或盗窃。它在保护企业、政府机构和个人的隐私和机密信息方面发挥着关键作用。以下是数据防泄漏系统的作用及优势: 作用&a…