博客
关于我
Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
阅读量:796 次
发布时间:2023-02-10

本文共 1124 字,大约阅读时间需要 3 分钟。

为什么不推荐使用 UUID 作为 MySQL 表的主键?

在数据库设计中,选择合适的主键策略至关重要。MySQL 官方推荐使用 auto_increment 的连续自增主键,而不是 UUID 或雪花算法生成的随机唯一标识符(uuid)。这种推荐背后有其深层次的原因,值得我们深入探讨。

UUID 的潜在问题

  • 性能影响

    UUID 的生成涉及复杂的算法和哈希运算,这会增加插入操作的开销。相比之下,auto_increment 只需维护一个简单的计数器,直接生成下一个连续的自增值,操作效率更高。

  • 存储需求

    UUID 通常占用 36 字节(16 字节的 UUID 加上 12 字节的时间戳),而 auto_increment 的主键只需 8 字节(在 64 位系统中)。使用 UUID 会显著增加存储空间的占用,尤其在高并发写入场景下,这可能带来性能瓶颈。

  • 唯一性保证

    虽然 UUID 是全球唯一的,但在实际应用中,数据库主键的唯一性通常可以通过数据库引擎自身管理,而无需依赖外部算法。auto_increment 主键自动保证唯一性,简化了数据库管理。

  • 可读性和维护

    UUID 的不规律性使得主键的可读性较差,尤其在调试和复制数据时,寻找特定记录的主键值会变得更加麻烦。而 auto_increment 主键具有可读性和管理性,方便数据库管理员进行分析和维护。

  • 测试与对比

    为了验证这些假设,我们可以设计一系列测试,比较不同主键生成策略对 INSERT 和 SELECT 操作的影响。以下是测试的三个表结构:

  • user_auto_key:使用 auto_increment 生成主键。
  • user_uuid:使用 UUID 作为主键。
  • user_random_key:使用雪花算法生成的随机唯一标识符作为主键。
  • 在测试过程中,我们将只改变每个表的主键生成策略,保持其他字段完全一致。通过测量插入操作的时间和查询效率,我们可以得出以下结论:

    • user_auto_key 表:插入速度最快,查询效率最高。
    • user_uuid 表:插入速度明显慢于 auto_increment,查询效率也略有下降。
    • user_random_key 表:虽然 UUID 的唯一性更强,但雪花算法生成的随机标识符并不能显著提升性能,反而可能因为存储需求增加而影响整体性能。

    总结

    从性能、存储需求和维护成本等多个方面来看,auto_increment 主键策略在 MySQL 中是更优的选择。尽管 UUID 提供了唯一性保证,但其复杂的生成算法和较高的存储需求使其不适合作为数据库主键。因此,MySQL 官方推荐使用连续自增主键策略,这种方法既高效又易于管理,是更合适的选择。

    转载地址:http://mkbfk.baihongyu.com/

    你可能感兴趣的文章
    Mysql 分页语句 Limit原理
    查看>>
    MySQL 创建新用户及授予权限的完整流程
    查看>>
    mysql 创建表,不能包含关键字values 以及 表id自增问题
    查看>>
    mysql 删除日志文件详解
    查看>>
    mysql 判断表字段是否存在,然后修改
    查看>>
    mysql 协议的退出命令包及解析
    查看>>
    mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
    查看>>
    mysql 多个表关联查询查询时间长的问题
    查看>>
    mySQL 多个表求多个count
    查看>>
    mysql 多字段删除重复数据,保留最小id数据
    查看>>
    MySQL 多表联合查询:UNION 和 JOIN 分析
    查看>>
    MySQL 大数据量快速插入方法和语句优化
    查看>>
    mysql 如何给SQL添加索引
    查看>>
    mysql 字段区分大小写
    查看>>
    mysql 字段合并问题(group_concat)
    查看>>
    mysql 字段类型类型
    查看>>
    MySQL 字符串截取函数,字段截取,字符串截取
    查看>>
    MySQL 存储引擎
    查看>>
    mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
    查看>>
    MySQL 存储过程参数:in、out、inout
    查看>>