首页 > 数据库 >mysql为什么不推荐uuid做主键?

mysql为什么不推荐uuid做主键?

时间:2024-09-06 16:23:40浏览次数:7  
标签:自增 UUID mysql ID 索引 做主 主键 存储空间 uuid

在MySQL中,不推荐使用UUID作为主键的主要原因还是性能问题,其次是可读性差和浪费存储空间。

  1. 性能问题:UUID 是128位的字符串,通常被表示为32个字符的十六进制数。相比自增的整数(如 AUTO_INCREMENT),UUID 更大,占用的存储空间也更多,这会增加索引大小,导致查询变慢,尤其是在大表中。

  2. 无序性:UUID 是无序的,这意味着每次插入新数据时,索引树需要频繁调整和重建。在 B-tree 索引结构中,自增的整数可以保证数据是顺序插入的,从而提高插入效率和减少碎片化,而 UUID 则会导致更多的页面拆分和索引重组,影响性能。

  3. 可读性差:UUID 由一串看似随机的字符组成,难以在人类可读性方面进行快速识别和调试。而自增整数更直观,方便开发人员理解和操作。

  4. 存储空间浪费:UUID 占用更多的存储空间,例如使用 CHAR(36) 或 BINARY(16) 存储 UUID,相比于 BIGINT 类型的自增 ID,这会占用更多的磁盘空间,并导致更高的内存和I/O开销。

一般主键推荐用什么?

在MySQL中,推荐使用以下几种方式作为主键,具体选择取决于应用场景:

主键 自增整数(AUTO_INCREMENT) 全局唯一ID(如雪花算法Snowflake ID) 组合主键 UUID(适用于特定场景)
使用场景 这是最常见的选择,适用于单数据库或单表中需要唯一标识每一行数据的情况。 适用于分布式系统中需要生成全局唯一ID的情况。 当一张表中没有一个字段能够唯一标识记录时,可以使用多个字段的组合来构成主键。例如在多对多关系的连接表中,常用外键组合作为主键。 尽管不推荐在大多数情况下使用UUID作为主键,但在需要保证跨数据库唯一性、无中心化ID生成的场景下,UUID仍然是一个有效的选择。
优势 插入顺序性:自增的整数保证了数据在表中按顺序插入,有利于索引的维护和性能优化。 存储效率高:整数类型(如 INT 或 BIGINT)占用的存储空间少,索引效率高。简单易用:设置方便,适合大多数应用场景。 全局唯一性:生成的ID在整个系统中都是唯一的,避免了跨数据库的冲突。可排序:如雪花算法生成的ID是基于时间的,可以保持一定的顺序性,有利于索引性能。 避免创建额外的唯一ID列:直接利用现有的字段来定义唯一性。 生成过程不依赖数据库,适合分布式环境。
缺点 比单纯的自增ID稍复杂,且生成ID的服务可能成为瓶颈。 组合主键的字段较多时,索引可能会变大,影响查询性能。 如前所述,UUID较大、无序,性能较差。

总结

对于大多数应用,推荐使用自增整数(AUTO_INCREMENT)作为主键,因为它在性能、存储效率和易用性方面都表现优异。

在分布式系统或需要全局唯一ID时,可以考虑使用雪花算法或其他全局唯一ID生成方案;在特定关系型场景中,组合主键也是一个选择。

转载自开思通智网:https://w3.opensnn.com/os/article/10001384

标签:自增,UUID,mysql,ID,索引,做主,主键,存储空间,uuid
From: https://blog.51cto.com/u_16744490/11938683

相关文章

  • linux中安装mysql
    目录1,删除centos7自带的mariadb2,下载mysql3,安装4,修改密码5,远程登录1,删除centos7自带的mariadb查看是否有mariadbrpm-qa|grepmariadb删除rpm-e--nodepsmariadb-libs-5.5.68-1.el7.x86_64再看下没有输出,删除成功2,下载mysqlMySQL::Download......
  • MySQL5.7.36之高可用架构部署-Atlas读写分离
    1、安装Atlas-2.2.1.el6.x86_64.rpmrpm-ivhAtlas-2.2.1.el6.x86_64.rpm2、进入Atlas目录并且备份配置文件cd/usr/local/mysql-proxy/confcptest.cnftest.cnf.bak3、密码加密采用的是自带的工具/usr/local/mysql-proxy/bin/encrypt123456#因为我的密码是1234564、......
  • Docker 容器技术:简化 MySQL 主从复制部署与优化
    文章目录前言一、为什么基于Docker搭建?二、利用Docker搭建主从服务器2.1配置Master(主)2.2配置Slave(从)2.3链接Master(主)和Slave(从)2.4测试主从复制三、常见问题3.1什么时候用读写分离?3.2MySQL主从复制原理3.3解决主从复制延迟有几种常见的方法?3.4造成mysql同步......
  • debian11 申通 无感考勤 mysql postgresql nacos集群
     echo"nameserver114.114.114.114nameserver8.8.8.8">/etc/resolv.conf echo"debhttps://mirrors.aliyun.com/debian/bullseyemainnon-freecontribdeb-srchttps://mirrors.aliyun.com/debian/bullseyemainnon-freecontribdebhttps://......
  • Mysql多实例安装
    MySQL多实例的本质在一台机器上开启多个不同的MySQL实例,也就是各实例监听不同的端口,提供不同的服务。多个实例公用一套MySQL安装程序,启动程序和配置文件可以是一个也可以是多个(推荐多个);各自的数据文件隔离;逻辑上各实例彼此隔离。为什么要使用多实例?优缺点?物理机性能强大,单个......
  • Docker 安装mysql
    1、从docker hub上拉取镜像到本地#dockerpullmysql:5.62.如果是不加版本直接拉取的话,默认的是最新版本 #dockerpullmysql:latest默认拉取最新的版本3.启动:#dockerrun--namemysql-p3306:3306-eMYSQL_ROOT_PASSWORD="设置你的mysql的密码"-dmysql:5.6......
  • 安装Mysql
    1.下载Mysql打开官网下载地址:https://downloads.mysql.com/archives/community/,按照截图所示下载即可。选择对应的操作系统Windows安装 1.下载到本地的安装包是zip包,选择一个指定目录进行解压,解压的过程就是安装的过程,解压后的位置就是MySQL的安装位置。注意,安装目录不允许......
  • 小皮出现80端口被System占用以及Mysql服务无法启动的解决方法
    80端口被System占用的解决方法80端口一般被当做网页服务器的默认端口,使用本机搭建服务器环境的时候,都会默认使用80端口来作为网页访问端,但是有的时候80端口会被其他程序占用,导致Apache启动失败。下面介绍一下如果80端口被占用后应该如何处理。经过查询,发现占用80端口的确是......
  • mysql索引优化
      1.联合索引,注意最左匹配原则:必须按照从左到右的顺序匹配,MySQL会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a=1andb=2andc>3andd=4如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意......
  • 美团面试:mysql 索引失效?怎么解决? (重点知识,建议收藏,读10遍+)
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......