MySQL中, 自增主键和UUID作为主键有什么区别?

首先我们来看看, 存储自增主键和uuid的数据类型

        我们知道, mysql中作为主键的通常是int类型的数据, 这个 数据从第一条记录开始, 从1开始主键往后递增, 例如我有100条数据, 那么根据主键排序后, 里面的记录从上往下一次就是1, 2, 3 ... 100, 但是UUID就不一样了, UUID是根据特殊的算法, 来生成唯一的一个字符串, 他的长度高达128个比特位, 而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12), 每一个x都是 0-9 或 a-f 范围内的一个十六进制的数字, 因此他需要使用字符串格式来进行存储, 标准的uuid的长度是32个字符, 外加两个短线, 也就是34个字符

        在mysql中对int类型值的处理速度是比字符串的速度要快的, 因此在速度上, 是肯定比不过自增主键的, 我们在比较UUID, 然后对这些UUID进行一个排序的, 是一个字符一个字符的进行比较的, 例如有两个UUID, 那么就是从第一个字符比较, 如果第一个字符相等, 就比较下一个字符的大小, 以此类推, 直到比较完了, 那么两个字符串就想等, 如果存在字符的大小区别, 那么就根据不同的这个字符进行排序, 以此类推.

        所以你是用UUID进行存储, 那么相比于自增的主键, 那么你就要花费额外的空间来存储这些UUID, 在插入主键或者是uuid的时候, 会有一个插入顺序的问题, 对于主键, 如果你不指定主键的值, 然后给这个主键设置自增值, 那么在插入的时候, 就会按照最大主键值的下一位插入, 这个时候就会性能很高, 为什么这么说呢? 

        因为mysql底层是一个数据页为一个基本的读写单元, 一个数据页可以存放16kb的数据, 你可以理解为数据页里面的记录是一个链表, 假如此时你不是按主键自增的顺序插入, 并且你插入的主键对应的数据页刚好满了装不下了, 此时的话, 你就需要将一个页拆分为两页, 这个就造成了不必要的性能消耗. 如果你按照自增的形式插入, 那么他们就会以此在最后一个数据页里面插入, 如果不够了, 就创建新的数据页, 而不是将一个页差分为两个, 然后拷贝数据.   

         但是如果你是使用的UUID作为主键, 那么就没有这个功能, 你的字符串id是有序的, 但是你不能保证, 你下一个生成的uuid, 就一定是最大的, 因此被分页的可能性就会很高. 同时每一个主键的占用的空间大了, 那么一个数据页装的数据记录也会变少, 页面增多, 所以在对这些记录进行操作, 将数据页读取到内存中的时候, 读取的页数页随之增多. io成本随之增多.

        在存储和性能方面, 还是自增主键更胜一筹.

说了这么多仿佛都是UUID的缺点, 那UUID做主键就么没有有点吗?

        有点肯定是有的 , 例如UUID的长度很长, 并且是随机生成的, 他的主键的复杂性很高, 并且没有规律, 你不能够通过数据分析来预测下一个主键id是多少,这种不可预测性对于需要保密性的应用场景较为适用。

        还有另外一种场景, 假如现在有这样一个需求, 我需要将一个自增主键的表, 导入另外一个和当前表结构相同的表, 但是这个表已经存了很多数据, 这个时候我将其插入, 就会导入失败, 因为两个表前面几部分的id是重合的, 因此会插入失败. 同样的当你去拆分数据库的时候, 也可以很好的拆分, 并且避免id的重复导致数据的错乱.

        此时如果你使用的是UUID, 那么就可以避免这个问题.

总结

在MySQL中,使用自增主键(AUTO_INCREMENT)和UUID作为主键的主要区别体现在以下几个方面:

  1. 唯一性
    • 自增主键:确保主键的唯一性,每次插入新行时,数据库会自动为主键生成一个唯一的、比之前插入的最大主键值大1的整数值。
    • UUID:具有极高的唯一性,基于一定算法(如随机数生成器或时间戳)生成,几乎不可能重复。UUID由32位16进制数表示,共128位(标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。
  2. 数据类型和存储
    • 自增主键:只适用于整数类型的主键列(如INT、BIGINT等),存储空间相对较小。
    • UUID:虽然也是字符串类型,但由于其长度较长(32个字符),存储空间相对较大。
  3. 插入性能
    • 自增主键:在插入新行时,数据库可以很容易地将新行插入到索引的末尾,减少了页分裂或移动数据的频率,从而提高了插入性能。
    • UUID:由于UUID是随机生成的,插入时位置具有不确定性,可能导致无序插入和内存碎片,插入性能相对较差。
  4. 索引和查询性能
    • 自增主键:由于其递增的特性,非常适合用作聚集索引(Clustered Index),能够优化查询性能。同时,较小的索引大小也可以减少内存消耗,更好地适应于内存缓存。
    • UUID:由于UUID的无序性,可能导致索引碎片化,影响查询性能。同时,较大的索引大小也可能增加内存消耗。
  5. 可预测性
    • 自增主键:主键值是可预测的,因为它们是按顺序生成的。
    • UUID:主键值是不可预测的,因为它们是随机生成的。这种不可预测性对于需要保密性的应用场景较为适用。
  6. 删除和重新插入
    • 自增主键:在删除并重新插入数据后,可能会出现主键值“跳跃”的现象,即新插入的主键值可能会比之前删除的主键值大很多。
    • UUID:UUID在删除和重新插入数据时,主键值不会受到影响,因为它们是随机生成的。

         自增主键和UUID在MySQL中各有优缺点,选择哪种方式作为主键取决于具体的应用场景和需求。例如,在需要高性能插入和查询的场景下,自增主键可能更合适;而在需要保证主键全局唯一性和不可预测性的场景下,UUID可能更合适。

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

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

相关文章

打卡信奥刷题(21)用Scratch图形化工具信奥P7071 [CSP-J2020] 优秀的拆分

使用2进制进行拆分是比较好的解决方案,毕竟对于大家来说二进制转换是非常熟的,如果不会可以参考打卡信奥刷题(19)用Scratch图形化工具信奥B3972 [语言月赛 202405] 二进制 题解 ,输出的时候再转换一下输出,…

M功能-支付平台(三)

target:离开柬埔寨倒计时-221day 前言 今天周六,但是在柬埔寨还是工作日,想着国内的朋友开始休周末就羡慕呀,记不清在这边过了多少个周六了,多到我已经习惯了。而且今天技术部还停电了,真的是热的受不了呀…

ASP.NET 代码审计

ASP.NET 官方文档 名词解释 IIS(Internet Information Services) IIS 是微软开发的一款 Web 服务器软件,用于在 Windows 服务器上托管和提供Web应用程序和服务。它支持 HTTP、HTTPS、FTP、SMTP 等多种协议,主要用于&#xff1a…

基于混合Transformer-CNN模型的多分辨率学习方法的解剖学标志检测

文章目录 Anatomical Landmark Detection Using a Multiresolution Learning Approach with a Hybrid Transformer-CNN Model摘要方法实验结果 Anatomical Landmark Detection Using a Multiresolution Learning Approach with a Hybrid Transformer-CNN Model 摘要 精确定位…

跨域计算芯片,一把被忽视的汽车降本尖刀

作者 |王博 编辑 |德新 2019年前后,「中央运算单元区域控制」的架构被提出。基于这一趋势,从板级的多芯片,到板级的单芯片,集成度越来越高,跨域计算芯片随之来到聚光灯下。 跨域计算芯片的特点是,与专为智…

牛客网刷题 | BC97 回文对称数

目前主要分为三个专栏,后续还会添加: 专栏如下: C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读! 初来乍到,如有错误请指出,感谢! 描述 今天牛牛学到了回文…

锁相环的一些学习笔记--(1)

下图两组1.2.3可以对应起来; 一些分析: 1.根据这个可知最后vco_voltage停在0.5v 参考资料: 1. Matlab https://www.bilibili.com/video/BV1bR4y1Z7Xg/?spm_id_from333.1296.top_right_bar_window_history.content.click&vd_source555…

如何将Windows PC变成Wi-Fi热点?这里提供详细步骤

序言 Windows 10和Windows 11都有内置功能,可以将你的笔记本电脑(或台式机)变成无线热点,允许其他设备连接到它并共享你的互联网连接。以下是操作指南。 由于Windows中隐藏的虚拟Wi-Fi适配器功能,你甚至可以在连接到另一个Wi-Fi网络或无线路由器时创建Wi-Fi热点,通过另…

鲁教版七年级数学上册-笔记

文章目录 第一章 三角形1 认识三角形2 图形的全等3 探索三角形全等的条件4 三角形的尺规作图5 利用三角形全等测距离 第二章 轴对称1 轴对称现象2 探索轴对称的性质4 利用轴对称进行设计 第三章 勾股定理1 探索勾股定理2 一定是直角三角形吗3 勾股定理的应用举例 第四章 实数1 …

Kafka 安装教程和基本操作

一、简介 Kafka 是最初由 Linkedin 公司开发,是一个分布式、分区的、多副本的、多订阅者,基于 zookeeper 协调的分布式日志系统(也可以当做 MQ 系统),常见可以用于 web/nginx 日志、访问日志,消息服务等等…

基于YOLO算法实现网球运动实时分析(附源码)

大家好,我是小F~ 今天给大家介绍一个计算机视觉实战的项目。 该项目使用YOLO算法检测球员和网球,并利用cnn提取球场关键点。 进而分析视频中的网球运动员,测量他们的速度、击球速度和击球次数。 使用win10电脑,Python …

【源码】java + uniapp交易所源代码/带搭建教程java交易所/完整源代码

java uniapp交易所源代码/带搭建教程java交易所/完整源代码 带简洁教程,未测 java uniapp交易所源代码/带搭建教程java交易所/完整源代码 - 吾爱资源网

【古董技术】ms-dos应用程序的结构

序 制定一个MS-DOS应用程序计划需要认真分析程序的大小。这种分析可以帮助程序员确定MS-DOS支持的两种程序风格中哪一种最适合该应用程序。.EXE程序结构为大型程序提供了好处,因为所有.EXE文件之前都有额外的512字节(或更多)的文件头。另一方…

C++第十七弹---string使用(下)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、标准库中的string类 1.1、string类的常用接口说明 1.1.1、string类对象的修改操作 1.1.2、string类对象非成员函数重载 总结 1、标准库中的…

牛客热题:有效括号

📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:有效括号题目链接方法一&#x…

Mycat+Mysql搭建数据集群实现数据分片存储

前言 MyCAT介绍 * 一个彻底开源的,面向企业应用开发的“大数据库集群”; * 支持事务、ACID、可以替代MySQL的加强版数据库; * 一个可以视为“MySQL”集群的企业级数据库,用来替代昂贵的Oracle集群; * 一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL; * 一个新颖…

2024.5.1学习记录

1、代码随想录:贪心刷题 2、react 高级使用( hoc render、props、函数组件、serState 传送门等) 3、游山玩水

《拯救大学生课设不挂科第四期之蓝桥杯是什么?我是否要参加蓝桥杯?选择何种语言?如何科学备赛?方法思维教程》【官方笔记】

背景: 有些同学在大一或者大二可能会被老师建议参加蓝桥杯,本视频和文章主要是以一个过来人的身份来给与大家一些思路。 比如蓝桥杯是什么?我是否要参加蓝桥杯?参加蓝桥杯该选择何种语言?如何科学备赛?等…

JavaEE之线程(7)_单例模式(设计模式概念、单例模式优点、懒汉、饿汉模式)

一、什么是设计模式? 单例模式是设计模式中较为常见的一种。那么,什么是单例模式? 设计模式(Design Pattern)都是一些相对优秀的解决方案,很多问题都是典型的、有代表性的问题,学习设计模式&am…

为什么本科毕业后我坚定地选择了就业而不是考研?

大家好,我是小布丁。今天来聊聊我为什么本科毕业后选择了就业而不是考研。 在整个大学期间,我被亲戚拷问最多的问题就是:准备考研吗?相信很多大学生都遇到过这种情况吧。 如果你说准备还好,亲戚大概率就不会问下去&a…