讲师中心 微信公众号
AI工具推荐 视频效率加速

为什么MySQL InnoDB推荐使用自增ID而非UUID作为主键?

千枫酱_1332

千枫酱_1332

发布时间:2026-06-15 08:56:00

|

1028人浏览过

|

来源于php中文网

原创

自增ID能避免页分裂、减少碎片和随机IO,而UUID主键导致页分裂频繁、查询变慢、锁竞争加剧;迁移需谨慎,推荐BINARY(16)存储并前置时间戳。

为什么mysql innodb推荐使用自增id而非uuid作为主键?

自增ID在InnoDB中不是“更好用”,而是直接决定了B+树聚簇索引能否高效运转——用UUID当主键,等于主动给写入和查询埋雷。

自增ID如何避免页分裂

InnoDB的聚簇索引要求数据物理顺序与主键逻辑顺序一致。自增ID插入时总是追加到B+树最右叶子节点末尾,页满就顺次分配新页,几乎不触发页分裂。而UUID是随机值,每次插入都要先搜索定位位置,大概率落在中间页里,一旦目标页已满(InnoDB默认填充因子15/16),就必须做页分裂:把原页约一半数据挪到新页,还要更新父节点指针。实测百万级写入,UUID主键表的Data_free值通常是自增ID表的3倍以上,说明碎片严重。

  • 检查碎片:运行SHOW TABLE STATUS LIKE 'orders',重点关注Data_free字段
  • 页分裂开销不止是CPU,还涉及磁盘I/O——被挤出的页可能已刷盘,又要重新读回Buffer Pool
  • 高并发下多个事务同时往不同中间页插入,会加剧锁竞争,死锁概率上升

UUID作为主键时索引查询变慢的真实原因

范围查询失效不是因为“索引没建好”,而是物理存储彻底打散。比如WHERE id BETWEEN 'a' AND 'z'在UUID主键表上,逻辑相邻的ID在磁盘上可能分散在几百个不连续页里,变成大量随机IO;而自增ID下,这类查询通常只读几个连续页。更隐蔽的是隐式类型转换:WHERE id = 123查BIGINT主键能走索引,但查CHAR(36)主键时,如果应用传的是'123'或漏掉横杠的32位字符串,MySQL无法匹配,直接退化为全表扫描。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 验证执行计划:对UUID主键表跑EXPLAIN SELECT * FROM users WHERE id = '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d',确保type是const而非ALL
  • 必须严格校验传参格式:CHAR(36)字段只接受标准格式'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',大小写、横杠缺一不可
  • 联合索引里千万别把UUID放最左,否则WHERE user_id = ? AND created_at > ?这种查询基本丧失范围能力

想换回自增ID?别直接ALTER TABLE

线上表从UUID切自增ID不是改个字段类型那么简单。InnoDB要重建整个聚簇索引,千万级表锁表时间常超20分钟;若存在外键约束(比如order_id字段引用该UUID主键),ALTER TABLE MODIFY id BIGINT AUTO_INCREMENT会直接报错ERROR 1832 (HY000): Cannot change column 'id': used in a foreign key constraint。二级索引、触发器、复制延迟都会被牵连。

  • 安全迁移路径:新增new_id BIGINT AUTO_INCREMENT列→用INSERT ... SELECT批量生成→停写→切换应用逻辑→删旧主键列
  • 如果必须保留UUID语义,至少转成BINARY(16)并用UUID_TO_BIN(UUID(), TRUE)(MySQL 8.0+),把时间戳高位前置提升局部性
  • 永远不要用UUID()原生函数结果直接存主键——36字符、带横杠、字符集排序慢,纯属自伤

真正难的不是选自增还是UUID,而是意识到主键设计一旦落地,后续修改成本远高于初期决策。尤其当表已有千万行、关联着十几个外键、支撑着核心交易链路时,一个主键类型选择,实际是在给未来两年的DBA和后端工程师挖坑。

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2313

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

1399

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

835

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3232

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

5468

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

1199

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5751

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

5002

2023.08.14

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 189人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn