🗣 Wd提问: mysql程序主键uuid vs int
🤖 Ai回答: 在 MySQL 中选择主键类型时,UUID 和 INT(自增整数) 是两种常见方案。它们各有优缺点,适用于不同的场景。以下是详细的对比分析:
✅ 1、INT 自增主键(推荐用于大多数场景)
特点:
使用 `BIGINT UNSIGNED AUTO_INCREMENT` 或 `INT AUTO_INCREMENT`
值递增,从 1 开始
存储空间小(4 字节或 8 字节)
插入性能高,索引效率好
优点:
| 优势 | 说明 |
| ⚡ 高性能 | 整数索引查找快,B+ 树结构高效,插入连续,减少页分裂 |
| 📦 小存储 | 比 UUID 节省 75% 以上空间(4 字节 vs 16 字节) |
| 🔍 索引效率高 | 连续值利于聚集索引,查询和排序速度快 |
| 💾 更少 I/O | 表和索引更小,磁盘读写更少 |
| 🔄 易于分页 | 可以用 `LIMIT OFFSET` 分页(虽然有性能问题,但比 UUID 好) |
缺点:
❌ 不安全:可预测,可能暴露业务逻辑(如用户 ID 递增)
❌ 不适合分布式系统:多个数据库实例无法保证唯一性
❌ 不易跨系统共享:不能在不同系统中直接复用主键
示例:
sql
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);
✅ 2、UUID 主键(适合分布式、匿名化、安全性要求高的场景)
特点:
使用 `CHAR(36)` 或 `BINARY(16)` 存储 UUID
唯一性极强,全球唯一(理论上)
无序,随机生成
优点:
| 优势 | 说明 |
| 🔐 全局唯一 | 无需中心化管理,适合微服务、多库同步 |
| 🛡️ 安全性高 | 不可预测,防止枚举攻击(如爬取所有用户) |
| 🌐 分布式友好 | 多个服务独立生成,避免冲突 |
| 🔄 可迁移 | 数据可安全复制到其他系统而不冲突 |
缺点:
| 缺点 | 说明 |
| ⚠️ 性能差 | 更大的索引体积 → 更慢的查询、插入、连接 |
| 📦 占空间大 | 16 字节 vs 4 字节(INT),索引变大,内存占用增加 |
| 🌀 无序插入 | 导致 B+ 树频繁页分裂,影响写性能 |
| 🔤 字符串操作 | 若用 `CHAR(36)`,需字符串比较,不如整数快 |
| 🔄 分页困难 | 无法使用 `OFFSET` 高效分页(建议改用游标) |
示例:
sql
CREATE TABLE users (
id CHAR(36) PRIMARY KEY DEFAULT (UUID()),
name VARCHAR(50),
email VARCHAR(100)
);
✅ 推荐使用 `BINARY(16)` 存储 UUID(更快),并配合 `UNIQUE` 约束。
sql
CREATE TABLE users (
id BINARY(16) PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID())),
name VARCHAR(50),
email VARCHAR(100)
);
🆚 对比总结表
| 维度 | INT 自增 | UUID |
| 存储空间 | 小(4~8 字节) | 大(16 字节) |
| 查询性能 | ⭐⭐⭐⭐⭐ | ⭐⭐☆☆☆ |
| 插入性能 | ⭐⭐⭐⭐⭐ | ⭐⭐☆☆☆ |
| 唯一性 | 局部(单库) | 全局唯一 |
| 分布式支持 | ❌ | ✅ |
| 安全性 | ❌(可预测) | ✅(不可预测) |
| 可读性 | ✅(数字) | ❌(长字符串) |
| 分页支持 | ✅ | ⚠️(需游标) |
| 索引大小 | 小 | 大(影响所有外键) |
✅ 最佳实践建议
1、优先使用 INT 自增主键
适用于单库、内部系统、性能敏感场景
如:订单、用户、文章等
2、使用 UUID 的情况:
微服务架构,多个数据库实例
数据需要跨系统共享(如 API 返回 ID)
需要防止 ID 泄露或枚举攻击
合并多个数据源时避免冲突
3、混合方案(推荐):
sql
CREATE TABLE users (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
uuid BINARY(16) UNIQUE DEFAULT (UUID_TO_BIN(UUID())),
name VARCHAR(50),
email VARCHAR(100)
);
内部用 `id` 优化性能
外部接口返回 `uuid` 提高安全性
✅ 小贴士
使用 `UUID_TO_BIN()` 和 `BIN_TO_UUID()` 函数提升性能
避免在 `WHERE` 条件中对 UUID 做 `LIKE` 或 `ORDER BY`(除非必要)
如果必须用 UUID,考虑使用 有序 UUID(如 `UUIDv7` 或 `time-based UUID`)来减少碎片
✅ 结论
默认选 INT 自增主键,除非你有明确的分布式、安全或全局唯一需求。
UUID 是“为特定场景设计的工具”,不是“万能主键”。
如果你不确定,先用 `INT AUTO_INCREMENT`,以后再加 `UUID` 字段作为外部标识即可。
📣 商家广告:





0
IP地址: 215.232.8.109
搜索次数: 0
提问时间: 2025-11-10 22:16:41
🛒 域名购买:
02.gs
85.chat
23.gold
kwzz.cn
827.net.cn
rq.gs
y-b.net
7.hk.cn
r-t.com.cn
zhong.tw
❓️ 热门提问:
东方财之道个人主页
ac是什么域名
vps多个域名
云服务器免费获得
广日电梯怎么在机房呼梯
关键字广告预算设置技巧
搭vps推荐
搜索引擎的本质是什么
香港服务器有哪几个
Django SEO中间件
豌豆Ai站群搜索引擎系统
🌐 域名评估:
linggai.com
rr.mo.cn
kimi.fan
vtol.today
yanggang.com
allonedu.cn
cwpz.cn
jiami.ai
kowr.cn
yu8.sd.cn
⛏ 最新挖掘:
凯里酸汤鱼
贵阳烤脑花
都匀毛尖茶
花溪牛肉粉
贵阳烤生蚝
贵阳烤豆腐
贵阳纸包鱼
贵阳特色菜
🖌 热门作画:
🤝 关于我们:
豌豆Ai
域名
建站
站群
留痕
推广
评估
源码
开发Ai
工具
日记
价格
加盟
广告
流量
留言
联系
🗨 加入群聊:
🔗 友情链接:
韩国vps便宜
贵阳财务软件
ai提问
🧰 站长工具:
Ai工具 whois查询 搜索
📢 温馨提示:本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
👉 技术支持:本站由豌豆Ai提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。