news 2026/3/1 1:38:04

年少不知自增好,错把UUID当个宝!!!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
年少不知自增好,错把UUID当个宝!!!

往期热门文章:

1、长期当程序员会失去什么?

2、支付宝:多线程事务怎么回滚?说用@Transactional可以回去等通知了!

3、效率拉爆:IntelliJ IDEA 中的这几款 AI 编程插件你都用过吗?

4、Spring6.0+Boot3.0:秒级启动、万级并发的开发新姿势

5、IDEA 2025.3 正式发布,骚操作,跟不上!

在 MySQL 中,使用UUID 作为主键在大表中可能会导致性能问题,尤其是在插入和修改数据时效率较低。以下是详细的原因分析,以及为什么修改数据会导致索引刷新,以及字符主键为什么效率较低。

1. UUID 作为主键的问题

(1)UUID 的特性

  • UUID 是一个 128 位的字符串,通常表示为 36 个字符(例如:550e8400-e29b-41d4-a716-446655440000)。

  • UUID 是全局唯一的,适合分布式系统中生成唯一标识。

(2)UUID 作为主键的缺点

1. 索引效率低
  • 索引大小:UUID 是字符串类型,占用空间较大(36 字节),而整型主键(如BIGINT)仅占用 8 字节。索引越大,存储和查询的效率越低。

  • 索引分裂:UUID 是无序的,插入新数据时,可能会导致索引树频繁分裂和重新平衡,影响性能。

2. 插入性能差
  • 随机性:UUID 是无序的,每次插入新数据时,新记录可能会插入到索引树的任意位置,导致索引树频繁调整。

  • 页分裂:InnoDB 存储引擎使用 B+ 树作为索引结构,随机插入会导致页分裂,增加磁盘 I/O 操作。

3. 查询性能差
  • 比较效率低:字符串比较比整型比较慢,尤其是在大表中,查询性能会显著下降。

  • 索引扫描范围大:UUID 索引占用的空间大,导致索引扫描的范围更大,查询效率降低。

2. 修改数据导致索引刷新的原因

(1)索引的作用

  • 索引是为了加速查询而创建的数据结构(如 B+ 树)。

  • 当数据被修改时,索引也需要同步更新,以保持数据的一致性。

(2)修改数据对索引的影响

  • 更新主键

    • 如果修改了主键值,MySQL 需要删除旧的主键索引记录,并插入新的主键索引记录。

    • 这个过程会导致索引树的调整,增加磁盘 I/O 操作。

  • 更新非主键列

    • 如果修改的列是索引列(如唯一索引、普通索引),MySQL 需要更新对应的索引记录。

    • 这个过程也会导致索引树的调整。

(3)UUID 主键的额外开销

  • 由于 UUID 是无序的,修改主键值时,新值可能会插入到索引树的不同位置,导致索引树频繁调整。

  • 相比于有序的主键(如自增 ID),UUID 主键的修改操作代价更高。

3. 字符主键导致效率降低的原因

(1)存储空间大

  • 字符主键(如 UUID)占用的存储空间比整型主键大。

  • 索引的大小直接影响查询性能,索引越大,查询时需要的磁盘 I/O 操作越多。

(2)比较效率低

  • 字符串比较比整型比较慢,尤其是在大表中,查询性能会显著下降。

  • 例如,WHERE id = '550e8400-e29b-41d4-a716-446655440000'的效率低于WHERE id = 12345

(3)索引分裂

  • 字符主键通常是无序的,插入新数据时,可能会导致索引树频繁分裂和重新平衡,影响性能。

4. 如何优化 UUID 主键的性能

(1)使用有序 UUID

  • 使用有序 UUID(如UUIDv7),减少索引分裂和页分裂。

  • 有序 UUID 的生成方式可以基于时间戳,保证插入顺序。

(2)将 UUID 存储为二进制

  • 将 UUID 存储为BINARY(16)而不是CHAR(36),减少存储空间。

    CREATE TABLE users ( id BINARY(16) PRIMARY KEY, name VARCHAR(255) );

(3)使用自增主键 + UUID

  • 使用自增主键作为物理主键,UUID 作为逻辑主键。

    CREATE TABLE users ( id BIGINT AUTO_INCREMENT PRIMARY KEY, uuid CHAR(36) UNIQUE, name VARCHAR(255) );

(4)分区表

  • 对大表进行分区,减少单个索引树的大小,提高查询性能。

总结

  • UUID 作为主键的缺点

    • 索引效率低,插入和查询性能差。

    • 修改数据时,索引需要频繁刷新,导致性能下降。

  • 字符主键效率低的原因

    • 存储空间大,比较效率低,索引分裂频繁。

  • 优化建议

    • 使用有序 UUID 或二进制存储。

    • 结合自增主键和 UUID。

    • 对大表进行分区。

作者:码农liuxin

来源:juejin.cn/post/7478495083374559270

往期热门文章:

1、干掉 VMware!!ProxmoxVE 真香~ 2、有哪些话一听就知道一个程序员是个水货? 3、CompletableFuture的5个大坑! 4、Spring 项目别再乱注入 Service 了!用 Lambda 封装个统一调用组件,爽到飞起 5、再见Maven!官方推出全新一代Java项目构建工具,性能提升2~10倍 6、程序员的伪年薪百万还能持续多久? 7、索引10连问,你能抗住第几问? 8、趣图:为什么程序员的代码不搞终身责任制? 9、我有 6 种统计线上接口耗时的方案,6种! 10、MySQL 模糊查询再也不用like+%了

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/25 14:42:57

突破语言壁垒:XUnity自动翻译插件实战指南

突破语言壁垒:XUnity自动翻译插件实战指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为看不懂日文游戏剧情而烦恼吗?是否曾经因为语言障碍错过了无数精彩的游戏内容&…

作者头像 李华
网站建设 2026/2/26 2:18:05

STM32CubeMX下载后无法打开?深度剖析原因与修复

STM32CubeMX 下载后打不开?别急,一文彻底解决启动难题 你是不是也遇到过这种情况:好不容易按照“ stm32cubemx 下载教程 ”一步步安装完软件,双击图标却毫无反应——没弹窗、无报错、任务管理器里闪现一下 java.exe 又消失……

作者头像 李华
网站建设 2026/2/18 5:10:05

基于SerDes的PCB封装走线等长控制项目应用

高速SerDes设计的“命门”:封装走线等长控制如何决定系统成败你有没有遇到过这样的情况——FPGA和ADC之间的高速链路总是间歇性断开,眼图闭合得像一条细缝,协议分析仪频频报出“帧同步丢失”,而硬件工程师反复检查电源、时钟、参考…

作者头像 李华
网站建设 2026/2/26 12:34:40

【计算机毕业设计案例】基于springboot+vue的医院综合管理系统实现与设计基于SpringBoot+Vue技术的医院运营管理系统的设计与实现(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/2/27 12:34:58

Spring Boot自动配置

Spring Boot自动配置 一、核心思想与目标 自动配置是Spring Boot的基石,其核心目标是:根据项目中引入的依赖(JAR包)和预设的配置,自动、智能地组装和配置Spring应用所需的Bean,实现 “约定大于配置” &am…

作者头像 李华
网站建设 2026/2/26 22:52:31

微信小程序体育球馆场地租赁商城系统

文章目录 具体实现截图主要技术与实现手段系统设计与实现的思路系统设计方法java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 具体实现截图 本系统(程序源码数据库调试部署讲解)带文档1…

作者头像 李华