在数据库中使用 UUID(Universally Unique Identifier)作为主键或唯一标识时,常见问题包括索引膨胀、性能下降、存储成本高、可读性差等。以下是优化 UUID 使用的系统性建议,按场景和优先级组织。
以 UUID v4 为例:
✅ 结论:避免使用 UUID v4 作为主键
| 类型 | 说明 | 推荐度 |
|---|---|---|
| UUID v1 | 时间戳 + MAC | ⚠️ 有隐私风险 |
| UUID v6 / v7 | 时间有序 + 随机 | ✅ 强烈推荐 |
| 自定义有序 UUID | 时间戳 + 序列 | ✅ |
UUID v7 示例:
018c8b2a-1234-7abc-8900-abcdef123456
✅ 推荐用于:
BINARY(16) 而不是 VARCHAR(36)UUID 存储方式对比:
| 存储方式 | 大小 | 性能 | 推荐 |
|---|---|---|---|
| VARCHAR(36) | 36 字节 | 差 | ❌ |
| CHAR(36) | 36 字节 | 差 | ❌ |
| BINARY(16) | 16 字节 | 好 | ✅ |
CREATE TABLE orders (
id BINARY(16) PRIMARY KEY
);
插入时:
INSERT INTO orders (id)
VALUES (UUID_TO_BIN(UUID(), true));
查询时:
SELECT BIN_TO_UUID(id, true) FROM orders;
✅ 可减少约 50% 的索引空间
id (BIGINT AUTO_INCREMENT) ← 主键
uuid (BINARY(16)) ← 对外唯一标识
✅ 优点:
✅ 适合:
PRIMARY KEY (id),
UNIQUE KEY uk_uuid (uuid)
InnoDB 中:
✅ 解决方案:
(tenant_id, created_at)❌ 不推荐:
✅ 推荐:
❌ 不推荐:
SELECT UUID();
✅ 推荐:
UUID.randomUUID() / uuid6github.com/google/uuid✅ 好处:
对外:UUID
对内:自增 ID
✅ 更安全 ✅ 避免 ID 枚举攻击
BINARY(16)uuid 类型SEQUENCE + UUID_id 默认就是 UUID / ObjectId❌ 不适合 UUID 的场景:
✅ 更适合:
✅ 推荐配置:
BINARY(16) 存储如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。