MySQL为啥不能用uuid做主键?

本文探讨了MySQL官方推荐使用自增ID而非UUID作为主键的原因。通过程序实例比较,发现UUID插入效率低,尤其是在大数据量时,由于UUID的无序性导致大量随机IO和页分裂,影响性能。自增ID则能提高页面填充率,减少寻址消耗和碎片。然而,自增ID也有其缺点,如隐私泄露、并发插入时的锁争用。建议根据业务需求选择合适的主键策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL为啥不能用uuid做主键?

前言

在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一,单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处?

本篇博客我们就来分析这个问题,探讨一下内部的原因。

本篇博客的目录
mysql程序实例
使用uuid和自增id的索引结构对比
总结

一、mysql和程序实例

1.1.要说明这个问题,我们首先来建立三张表

分别是user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid作为主键,
随机key作为主键,其它我们完全保持不变.

根据控制变量法,我们只把每个表的主键使用不同的策略生成,而其他的字段完全一样,然后测试一下表的插入速度和查询速度:

注:这里的随机key其实是指用雪花算法算出来的前后不连续不重复无规律的id:一串18位长度的long值

1.2.光有理论不行,直接上程序,使用spring的jdbcTemplate来实现增查测试:

技术框架:springboot+jdbcTemplate+junit+hutool,程序的原理就是连接自己的测试数据库,然后在相同的环境下写入同等数量的数据,来分析一下insert插入的时间来进行综合其效率,为了做到最真实的效果,所有的数据采用随机生成,比如名字、邮箱、地址都是随机生成。

package com.wyq.mysqldemo;
import cn.hutool.core.collection.CollectionUtil;
import com.wyq.mysqldemo.databaseobject.UserKeyAuto;
import
### 使用 UUID 作为主键的最佳实践 在 MySQL 数据库中使用 UUID 作为主键具有独特的优势,尤其是在分布式环境中。然而,在实现过程中需要注意一些细节以确保最佳性能。 #### 创建表结构 当创建带有 UUID 主键的表格时,建议定义 `CHAR(36)` 类型列并设置为 `NOT NULL` 和 `UNIQUE` 属性。为了简化操作流程,可以通过默认值的方式自动生成新的 UUID 值[^2]: ```sql CREATE TABLE users ( user_uuid CHAR(36) PRIMARY KEY DEFAULT (UUID()), username VARCHAR(50), email VARCHAR(100) ); ``` 上述 SQL 语句会建立一张名为 `users` 的表,其中 `user_uuid` 字段将自动填充由 `UUID()` 函数产生的唯一标识符。 #### 插入数据 向包含 UUID 主键的表内插入记录非常简单,只需省略该字段即可让其自行生成: ```sql INSERT INTO users(username, email) VALUES ('john_doe', 'john@example.com'); ``` 执行这条命令之后,系统将会为新加入的数据行分配独一无二的 `user_uuid` 值。 #### 查询优化 尽管 UUID 提供了全局唯一性的优势,但由于其长度较长且随机分布特性可能导致索引效率降低。因此对于高并发读取场景下的应用来说,可能还需要考虑其他因素来平衡查询速度与存储成本之间的关系[^1]。 #### 处理特殊字符 由于标准格式下生成的 UUID 含有连字符 `-` ,这可能会引起与其他系统的兼容性问题。为了避免这种情况发生,可以在保存之前利用 `REPLACE` 函数移除这些不必要的符号[^4]: ```sql SET @raw_uuid = UUID(); UPDATE some_table SET uuid_field=REPLACE(@raw_uuid,'-',''); ``` 以上代码片段展示了如何先获取原始形式的 UUID 并将其转换成无分隔线版本再更新到指定字段之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值