MySQL 主键不推荐使用 UUID(尤其是无序 UUID)的主要原因包括:
| 指标 | 自增 BIGINT | UUID v4 | UUID v1/v7 |
|---|---|---|---|
| 插入吞吐量 | 100% (基准) | 15%-30% | 60%-80% |
| 索引大小 | 100% (基准) | 180%-220% | 180%-220% |
| Buffer Pool 命中率 | 高 | 低 | 中等 |
CREATE TABLE users (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
uid CHAR(36) NOT NULL UNIQUE COMMENT '对外业务标识',
-- 其他字段
UNIQUE KEY uk_uid (uid)
);
-- 使用时间前缀的有序 ID
CREATE TABLE orders (
id CHAR(21) PRIMARY KEY, -- 格式: {timestamp}{random}
created_time DATETIME NOT NULL
);
-- 示例 ID: 20250115123456_abc123
-- 使用自动生成的紧凑有序 ID
CREATE TABLE logs (
id BINARY(16) DEFAULT (UUID_TO_BIN(UUID(), 1)) PRIMARY KEY,
-- 1 表示有序模式
);
默认使用自增主键,除非有明确的分库分表需求
需要分布式 ID 时:
已使用无序 UUID 的迁移方案:
-- 1. 新增自增主键列
ALTER TABLE table ADD COLUMN new_id BIGINT AUTO_INCREMENT UNIQUE;
-- 2. 逐步迁移外键关系
-- 3. 最终切换主键(需要停机维护)
分库分表场景:
以下场景可考虑使用 UUID:
如果必须使用 UUID,请监控:
SHOW TABLE STATUSSHOW ENGINE INNODB STATUSOPTIMIZE TABLE 或使用在线模式重建表总的来说,99% 的 MySQL 场景使用自增主键都是最优选择,仅在特定分布式场景需要权衡选择有序 UUID 或专门的分布式 ID 方案。