防城港市文章资讯

MySQL 主键不推荐使用 UUID 的深层原因及解决方案

2026-03-28 11:03:02 浏览次数:2
详细信息

MySQL 主键不推荐使用 UUID(尤其是无序 UUID)的主要原因包括:

深层原因分析

1. 索引性能问题

2. 存储空间开销

3. 写入性能影响

4. 运维复杂度

性能对比数据

指标 自增 BIGINT UUID v4 UUID v1/v7
插入吞吐量 100% (基准) 15%-30% 60%-80%
索引大小 100% (基准) 180%-220% 180%-220%
Buffer Pool 命中率 中等

推荐解决方案

方案1:使用自增主键 + UUID 业务标识

CREATE TABLE users (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    uid CHAR(36) NOT NULL UNIQUE COMMENT '对外业务标识',
    -- 其他字段
    UNIQUE KEY uk_uid (uid)
);

方案2:使用有序 UUID(推荐)

方案3:组合主键策略

-- 使用时间前缀的有序 ID
CREATE TABLE orders (
    id CHAR(21) PRIMARY KEY, -- 格式: {timestamp}{random}
    created_time DATETIME NOT NULL
);

-- 示例 ID: 20250115123456_abc123

方案4:MySQL 8.0 的新特性

-- 使用自动生成的紧凑有序 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,请监控:

总的来说,99% 的 MySQL 场景使用自增主键都是最优选择,仅在特定分布式场景需要权衡选择有序 UUID 或专门的分布式 ID 方案。

相关推荐