请教大佬,在实际开发实践中,mysql中uuid用什么类型存放比较好?
推荐使用BINARY(16) 来存储UUID。
mysql8.0写法
-- 创建表时使用BINARY(16)存储UUID
CREATE TABLE example_table (
id BINARY(16) PRIMARY KEY,
name VARCHAR(255)
);
-- 插入数据时转换UUID
INSERT INTO example_table (id, name) VALUES (UUID_TO_BIN(UUID()), 'example_name');
-- 查询数据时转换回UUID
SELECT BIN_TO_UUID(id) AS id, name FROM example_table;
mysql5.6写法
-- 创建表时使用 BINARY(16) 存储 UUID
CREATE TABLE example_table (
id BINARY(16) PRIMARY KEY,
name VARCHAR(255)
);
-- 插入数据时将 UUID 转换为二进制格式
INSERT INTO example_table (id, name)
VALUES (UNHEX(REPLACE(UUID(), '-', '')), 'example_name');
-- 查询数据时将二进制格式的 UUID 转换回可读格式
SELECT HEX(id) AS id, name
FROM example_table;
5 回答3.3k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
5 回答1.4k 阅读
3 回答1.3k 阅读✓ 已解决
1 回答1.6k 阅读✓ 已解决
3 回答2k 阅读
在 MySQL 中存储 UUID 时,需要注意以下几个关键问题及优化方案:
1. 存储方式选择
方案对比
CHAR(36)
BINARY(16)
优化建议
MySQL 8.0+ 使用
BINARY(16)
+ 内置函数:旧版本 MySQL 可手动移除连字符并存储为 BINARY(16):
2. 主键性能优化
问题
解决方案
有序 UUID (时间戳前置)
改造 UUID 结构,使前半部分包含时间信息(如 UUIDv6/v7),提升索引连续性。
组合主键
使用
AUTO_INCREMENT
列作为主键,额外增加 UUID 列用于业务标识:3. 函数与索引优化
函数处理
利用
UUID_TO_BIN
的swap_flag
参数优化排序:前缀索引
对
CHAR(36)
列使用前缀索引(虽不推荐,但可减少空间):4. 应用场景决策
何时使用 UUID
何时避免 UUID
AUTO_INCREMENT
)SMALLER
类型替代)5. 完整表示例
总结建议
BINARY(16)
+ 内置函数CHAR(36)