MySQL内置的UUID函数可以直接生成全局唯一的字符串标识,相比自增主键,它在分布式场景、数据合并等场景下具备独特的优势,是很多开发者生成唯一标识的首选方案。

UUID函数的基本用法
MySQL中UUID函数的语法非常简单,不需要传入任何参数,直接调用即可返回生成的UUID值。基本调用格式如下:
-- 直接调用UUID函数生成唯一标识 SELECT UUID();
上述语句执行后会返回一个长度为36的字符串,格式为8-4-4-4-12的分段样式,例如a1b2c3d4-e5f6-7890-abcd-1234567890ef。这个字符串由32个十六进制字符和4个连字符组成,理论上全局唯一。
UUID的结构解析
生成的UUID字符串各分段有固定的含义,具体结构如下:
| 分段位置 | 长度 | 说明 |
|---|---|---|
| 第一段 | 8位 | 时间戳的低部分 |
| 第二段 | 4位 | 时间戳的中部分 |
| 第三段 | 4位 | 时间戳的高部分与版本号,UUID函数生成的是版本1的UUID |
| 第四段 | 4位 | 时钟序列与保留位 |
| 第五段 | 12位 | 节点标识,通常是生成UUID的设备的MAC地址 |
实际应用场景示例
1. 作为表的主键使用
可以在创建表时将UUID作为主键的默认值,插入数据时自动生成唯一标识:
-- 创建使用UUID作为主键的表
CREATE TABLE user_info (
id VARCHAR(36) PRIMARY KEY DEFAULT UUID(),
user_name VARCHAR(50) NOT NULL,
age INT,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 插入数据,不需要手动指定id值
INSERT INTO user_info (user_name, age) VALUES ('张三', 25);
INSERT INTO user_info (user_name, age) VALUES ('李四', 28);
-- 查询数据查看生成的UUID主键
SELECT * FROM user_info;
2. 生成业务唯一标识
除了作为主键,也可以生成业务层面的唯一标识,比如订单号、流水号等:
-- 生成订单唯一标识并插入订单表
CREATE TABLE order_info (
order_id VARCHAR(36) PRIMARY KEY,
product_name VARCHAR(100),
price DECIMAL(10,2),
order_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 插入订单时生成UUID作为订单号
INSERT INTO order_info (order_id, product_name, price) VALUES (UUID(), '笔记本电脑', 4999.00);
UUID作为唯一标识的优缺点
优点
- 全局唯一性高,不同数据库实例、不同服务器生成的UUID几乎不会重复,适合分布式场景
- 不需要依赖额外的主键生成服务,MySQL内置函数即可实现,使用成本低
- 生成过程不需要查询数据库最大值,避免高并发下的锁竞争问题
缺点
- UUID是字符串类型,相比整数自增主键,存储空间更大,索引效率更低
- 生成的UUID是无序的,插入数据时会导致聚簇索引频繁分裂,影响插入性能
- 长度较长,在传输、展示时不够友好,可读性差
常见问题与优化方案
1. 去除UUID中的连字符
如果不需要分段格式,可以使用REPLACE函数去除连字符,得到32位的纯字符串:
-- 生成无连字符的UUID SELECT REPLACE(UUID(), '-', '') AS uuid_without_hyphen;
2. 提升UUID的插入性能
如果大量使用UUID作为主键,可以考虑使用有序UUID的方案,比如对UUID进行时间排序处理,或者使用MySQL 8.0及以上版本提供的UUID_TO_BIN函数将UUID转换为二进制存储,同时可以指定排序方式:
-- MySQL 8.0+ 将UUID转换为有序二进制存储 SELECT UUID_TO_BIN(UUID(), TRUE) AS ordered_uuid_bin; -- 二进制转回UUID字符串 SELECT BIN_TO_UUID(uuid_to_bin(UUID(), TRUE), TRUE) AS uuid_str;
3. 避免UUID重复的问题
正常情况下UUID函数生成的重复概率极低,如果出现重复,通常是因为服务器时间被回拨或者MAC地址冲突,需要确保服务器时间同步,并且生成UUID的节点标识唯一。
注意:UUID函数生成的UUID是基于时间、MAC地址等信息生成的,如果服务器没有网卡或者MAC地址为全0,UUID的唯一性会受到影响,这种场景下建议使用其他唯一标识生成方案。