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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 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的数据, 你可以理解为数据页里面的记录是一个链表, 假如此时你不是按主键自增的顺序插入, 并且你插入的主键对应的数据页刚好满了装不下了, 此时的话, 你就需要将一个页拆分为两页, 这个就造成了不必要的性能消耗. 如果你按照自增的形式插入, 那么他们就会以此在最后一个数据页里面插入, 如果不够了, 就创建新的数据页, 而不是将一个页差分为两个, 然后拷贝数据.  

image.png

        但是如果你是使用的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)。
  1. 数据类型和存储
  • 自增主键:只适用于整数类型的主键列(如INT、BIGINT等),存储空间相对较小。
  • UUID:虽然也是字符串类型,但由于其长度较长(32个字符),存储空间相对较大。
  1. 插入性能
  • 自增主键:在插入新行时,数据库可以很容易地将新行插入到索引的末尾,减少了页分裂或移动数据的频率,从而提高了插入性能。
  • UUID:由于UUID是随机生成的,插入时位置具有不确定性,可能导致无序插入和内存碎片,插入性能相对较差。
  1. 索引和查询性能
  • 自增主键:由于其递增的特性,非常适合用作聚集索引(Clustered Index),能够优化查询性能。同时,较小的索引大小也可以减少内存消耗,更好地适应于内存缓存。
  • UUID:由于UUID的无序性,可能导致索引碎片化,影响查询性能。同时,较大的索引大小也可能增加内存消耗。
  1. 可预测性
  • 自增主键:主键值是可预测的,因为它们是按顺序生成的。
  • UUID:主键值是不可预测的,因为它们是随机生成的。这种不可预测性对于需要保密性的应用场景较为适用。
  1. 删除和重新插入
  • 自增主键:在删除并重新插入数据后,可能会出现主键值“跳跃”的现象,即新插入的主键值可能会比之前删除的主键值大很多。
  • UUID:UUID在删除和重新插入数据时,主键值不会受到影响,因为它们是随机生成的。

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


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
5
分享
相关文章
mysql 的ReLog和BinLog区别
MySQL中的重做日志和二进制日志是确保数据库稳定性和可靠性的关键组件。重做日志主要用于事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务;而二进制日志记录SQL语句的逻辑变化,支持数据复制、恢复和审计。两者在写入时机、存储方式及配置参数等方面存在显著差异。
112 6
MySQL 和 Oracle 的区别?
本文对比了Oracle和MySQL数据库的多个方面。Oracle适用于大型数据库,支持高并发和大访问量,市场占有率为40%,安装占用空间较大,约3G;而MySQL适合中小型应用,是开源免费的,安装仅需152M。两者在主键生成、字符串处理、SQL语句、事务处理等方面存在差异。Oracle功能更为强大,尤其在企业级应用中表现突出,而MySQL则以简单易用见长。
107 7
MySQL 和 Oracle 的区别?
MYSQL支持的存储引擎有哪些, 有什么区别
MYSQL存储引擎有很多, 常用的就二种 : MyISAM和InnerDB , 者两种存储引擎的区别 ; ● MyISAM支持256TB的数据存储 , InnerDB只支持64TB的数据存储 ● MyISAM 不支持事务 , InnerDB支持事务 ● MyISAM 不支持外键 , InnerDB支持外键
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL主键谁与争锋:MySQL为何钟爱自增主键ID+UUID?
本文深入探讨了在MySQL中使用自增类型主键的优势与局限性。自增主键通过保证数据的有序性和减少索引维护成本,提升了查询和插入性能,简化了数据库管理和维护,并提高了数据一致性。然而,在某些业务场景下,如跨表唯一性需求或分布式系统中,自增主键可能无法满足要求,且存在主键值易预测的安全风险。因此,选择主键类型时需综合考虑业务需求和应用场景。
132 2
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
92 9
MySQL和Redis的区别
**MySQL和Redis的区别** MySQL和Redis都是流行的数据存储解决方案,但它们在设计、用途和特性上有显著区别。理解这些区别有助于选择合适的数据库来满足不同的应用需求。本文将详细介绍MySQL和Redis的区别,包括它们的架构、使用场景、性能和其他关键特性。 ### 一、基本概述 **MySQL**: MySQL是一个关系型数据库管理系统(RDBMS),使用结构化查询语言(SQL)进行数据管理。它支持事务、复杂查询和多种存储引擎,广泛应用于各种Web应用、企业系统和数据分析项目。 **Redis**: Redis是一个基于内存的键值数据库,通常被称为NoSQL数
336 4
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
110 82

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等