MySQL中如何利用UUID函数生成唯一标识

来源:图像处理网作者:又改需求头衔:程序员
导读:本期聚焦于小伙伴创作的《MySQL中如何利用UUID函数生成唯一标识》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《MySQL中如何利用UUID函数生成唯一标识》有用,将其分享出去将是对创作者最好的鼓励。

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

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的唯一性会受到影响,这种场景下建议使用其他唯一标识生成方案。

MySQLUUID唯一标识UUID函数修改时间:2026-06-18 13:03:45

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。