UUID(通用唯一识别码)在数据库中常用于主键或唯一标识字段,但它的性能影响取决于UUID 版本、存储方式、索引类型以及数据规模。下面从多个维度系统说明。
| UUID 版本 | 是否有序 | 是否含时间 | 性能评价 |
|---|---|---|---|
| v1(时间+MAC) | 基本有序 | ✅ | 较好,但可能因时钟回拨或MAC被禁用而不稳定 |
| v3(MD5) | 无序 | ❌ | 不推荐 |
| v4(随机) | 完全无序 | ❌ | 最差,索引性能最差 |
| v5(SHA1) | 无序 | ❌ | 不推荐 |
| v7(时间+随机) | 近似有序 | ✅ | ✅ 推荐(现代方案) |
✅ 结论:
UUID v4 对数据库性能影响最大,UUID v7 最友好。
B+Tree 索引的前提是:
新插入的 key 尽量接近当前索引最大值
UUID v4 的问题:
| 类型 | 字节数 | 对比 |
|---|---|---|
| BIGINT(自增) | 8 字节 | ✅ |
| UUID(binary) | 16 字节 | ❌ |
| UUID(varchar 36) | 36 字节 | ❌❌ |
影响:
| 维度 | UUID | 自增 ID |
|---|---|---|
| 唯一性 | 全局 | 仅本表 |
| 安全性 | 高 | 低 |
| 插入性能 | 差 | 好 |
| 索引友好 | 差 | 好 |
| 分布式 | 优秀 | 难 |
示例(PostgreSQL / MySQL 8+):
uuidv7();
BINARY(16) 存储,而不是 VARCHARCREATE TABLE t (
id BINARY(16) PRIMARY KEY
);
比 VARCHAR(36):
替代方案:
id BIGINT AUTO_INCREMENT PRIMARY KEY,
uuid BINARY(16) UNIQUE
UUID 不是天生慢,而是“无序 UUID + B+Tree 主键”这个组合慢。
最佳实践:
如果你愿意,我可以针对 MySQL / PostgreSQL / SQL Server / MongoDB 给出具体建表方案和性能对比。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。