MySQL 主键不推荐使用 UUID(尤其是无序 UUID)的主要原因包括:
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 STATUS
SHOW ENGINE INNODB STATUS
OPTIMIZE TABLE
总的来说,99% 的 MySQL 场景使用自增主键都是最优选择,仅在特定分布式场景需要权衡选择有序 UUID 或专门的分布式 ID 方案。