游乐游手机版
首页/数据库/文章详情

MySQL为什么建议用自增主键而不用UUID作为索引

时间:2026-08-23 13:00
为什么说 AUTO_INCREMENT 自增主键通常比 UUID 更适合作为 MySQL 主键?原因在于,自增主键采用顺序写入方式,能够有效减少页分裂,提升缓存局部性,并显著降低磁盘 I O 开销。相比之下,UUID 的随机性会让索引碎片更严重,碎片率往往高出数倍,范围查询也容易退化为随机 I O,

为什么说 AUTO_INCREMENT 自增主键通常比 UUID 更适合作为 MySQL 主键?原因在于,自增主键采用顺序写入方式,能够有效减少页分裂,提升缓存局部性,并显著降低磁盘 I/O 开销。相比之下,UUID 的随机性会让索引碎片更严重,碎片率往往高出数倍,范围查询也容易退化为随机 I/O,同时还会带来存储空间膨胀,以及因传参格式不一致导致索引失效等问题。

为什么MySQL建议使用自增主键而不是UUID作为索引?

AUTO_INCREMENT 主键在绝大多数业务场景下都比 UUID() 更适合充当 MySQL 主键,关键并不是“UUID 唯一性不足”,而是它会直接破坏 InnoDB 聚簇索引原本按顺序组织数据的物理存储方式。

自增ID插入不易触发页分裂,而UUID几乎一定会增加页分裂概率

InnoDB 的聚簇索引会将数据行与主键值存储在一起,B+ 树叶子节点必须按照主键顺序进行组织和链接。 AUTO_INCREMENT 通常只会在索引尾部顺序追加,新页分配更简单、更连续,INSERT 性能也更稳定,延迟常见在 0.2–0.5ms; 而 UUID() 生成的是随机字符串(如 '550e8400-e29b-41d4-a716-446655440000'),每次插入前都需要遍历 B+ 树寻找目标位置,大多数情况下会落到中间页——一旦已有页写满,就会触发页拆分、指针重连,导致额外 I/O 明显增加。 在百万级数据写入测试中,使用 UUID 的表其 Data_free 值(可通过 SHOW TABLE STATUS 查看)通常会达到自增主键表的 3 倍以上,这说明索引碎片非常明显。

UUID主键会让范围查询更容易退化为随机IO

WHERE id BETWEEN 1000 AND 2000 这样的范围查询,在使用自增主键时,通常只需要扫描少量连续的数据页; 但如果改成 UUID 主键,逻辑上相近的 ID 在磁盘上的物理位置往往并不相邻,可能分散在几十甚至上百个不同的数据页中,从顺序读取变成大量随机读取,缓存命中率也会显著下降。 还有一个更容易被忽视的问题:如果 ORM 框架或应用层传参不够规范(例如传入 '9b1deb4d3b7d4bad9bdd2b0d7b3dcb6d' 时缺少横杠,或者大小写格式混杂),那么 WHERE id = ? 很可能无法正确命中索引,执行计划中的 type 甚至会从 const 退化为 ALL,直接影响查询性能。

存储空间膨胀会进一步拖累所有索引性能

MySQL 主键不仅仅影响主键索引本身,它还会被所有二级索引重复存储,作为定位行记录的“指针”使用。 BIGINT 主键只占 8 字节,而 CHAR(36) 类型的 UUID 则需要 36 字节——如果单表达到 1000 万行,仅主键索引就可能额外多占约 280MB;如果再叠加 5 个二级索引,总体存储膨胀接近 1.4GB。 即便使用 BINARY(16) 配合 UUID_TO_BIN(UUID(), TRUE) 来优化 UUID 存储,仍然比 BIGINT 多出 8 字节,同时也无法从根本上解决 UUID 随机写入带来的索引离散和性能问题。 真正必须使用 UUID 的场景其实并不多,通常只有两类:一类是分库分表后又没有全局序列服务,另一类是多库数据需要合并且无法重新映射主键。至于常见的“防爬虫”“提升安全性”“更适合分布式系统”等说法,通常都可以通过映射表、业务层 ID 转换或前端脱敏等方式实现,没有必要用主键索引性能作为代价。
来源:https://www.php.cn/faq/3026686.html
上一篇Oracle存储过程如何授予直接对象权限与设置方法 下一篇Oracle Data Guard删除废弃备库配置的方法与步骤
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Redis是什么:核心特性、架构与应用场景解析
数据库 · 2026-09-01

Redis是什么:核心特性、架构与应用场景解析

Redis是一款基于内存的键值型NoSQL数据库,以超高读写速度和丰富的数据结构著称。本文系统梳理Redis的核心特性、架构组成、性能优势及典型应用场景,并通过与Memcached、MySQL、MongoDB的对比,帮助开发者快速判断Redis是否适合当前业务需求。

Windows 安装 MongoDB 完整图文教程
数据库 · 2026-09-01

Windows 安装 MongoDB 完整图文教程

本文详细介绍在 Windows 系统上安装 MongoDB 的完整流程。从官网下载 MSI 安装包开始,逐步演示自定义安装路径、配置 Windows 服务、跳过 MongoDB Compass 等关键选项,并提供通过系统服务列表验证安装是否成功的方法,帮助开发者快速搭建本地 MongoDB 环境。

Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动
数据库 · 2026-09-01

Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动

本文详解在 Linux 系统下安装 MongoDB 的完整流程,涵盖依赖包安装、二进制包下载解压、环境变量配置、数据与日志目录创建及服务启动验证。通过标准化命令与路径说明,帮助开发者快速完成部署并确认服务状态。

MacOS安装MongoDB完整教程
数据库 · 2026-09-01

MacOS安装MongoDB完整教程

本文介绍在MacOS系统下安装MongoDB的完整流程,涵盖下载、解压、目录配置、环境变量设置及服务启动。通过明确的命令与参数说明,帮助开发者快速完成环境搭建并验证安装结果。

Ubuntu系统安装与配置Redis完整指南
数据库 · 2026-09-01

Ubuntu系统安装与配置Redis完整指南

本文详解在Ubuntu系统中安装Redis的两种主流方式:apt在线安装与源码编译安装。涵盖版本选择逻辑、服务启停与状态检查、连接验证方法,以及在线练习工具与桌面GUI客户端的对比与使用建议,帮助开发者快速搭建并验证Redis运行环境。