博客
关于我
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主从不同步
    查看>>
    mysql主从同步及清除信息
    查看>>
    MySQL主从同步相关-主从多久的延迟?
    查看>>
    mysql主从同步配置方法和原理
    查看>>
    mysql主从复制 master和slave配置的参数大全
    查看>>
    MySQL主从复制几个重要的启动选项
    查看>>
    MySQL主从复制及排错
    查看>>
    mysql主从复制及故障修复
    查看>>
    MySQL主从复制的原理和实践操作
    查看>>
    webpack loader配置全流程详解
    查看>>
    mysql主从复制,读写分离,半同步复制实现
    查看>>
    MySQL主从失败 错误Got fatal error 1236解决方法
    查看>>
    MySQL主从架构与读写分离实战
    查看>>
    MySQL主从篇:死磕主从复制中数据同步原理与优化
    查看>>
    mysql主从配置
    查看>>
    MySQL之2003-Can‘t connect to MySQL server on ‘localhost‘(10038)的解决办法
    查看>>
    MySQL之CRUD
    查看>>
    MySQL之DML
    查看>>
    Mysql之IN 和 Exists 用法
    查看>>
    MYSQL之REPLACE INTO和INSERT … ON DUPLICATE KEY UPDATE用法
    查看>>