使用雪花id或uuid作为Mysql主键,被老板怼了一顿!

推荐:一:mysql和程序实例 1.1:为解答此问题,我们构建了三张表:user_auto_key, user_uuid, user_random_key。每张表的主键采用不同的生成策略,其余字段保持一致,以控制变量法测试表的插入速度和查询效率。这里的随机key指的是使用雪花算法生成的、前后不连续、不重复、无规律的ID,长度为18位的...
使用雪花id或uuid作为Mysql主键,被老板怼了一顿!
推荐:一:mysql和程序实例

1.1:为解答此问题,我们构建了三张表:user_auto_key, user_uuid, user_random_key。每张表的主键采用不同的生成策略,其余字段保持一致,以控制变量法测试表的插入速度和查询效率。这里的随机key指的是使用雪花算法生成的、前后不连续、不重复、无规律的ID,长度为18位的long值。

1.2:理论阐述后,直接上程序实践。利用spring的jdbcTemplate实现增查测试,采用springboot+jdbcTemplate+junit+hutool框架。程序在相同环境下生成同等数量的数据,通过插入10w数据分析效率。所有数据通过随机生成,确保真实效果。程序已上传至gitee,详情可见文底。

1.3:程序写入结果展示

1.4:效率测试结果分析

在已有130w数据量时,测试插入10w数据,发现uuid插入效率垫底。随着数据量增加至100w左右,uuid效率下降明显。效率排名为:auto_key > random_key > uuid。为何出现这种现象?带着疑问,我们接下来探讨。

二:使用uuid和自增ID的索引结构对比

2.1:自增ID的内部结构:自增值顺序存储,提升页面填充率,减少页分裂和碎片生成。新插入的行总是紧挨着已有最大数据行,定位快,减少额外消耗。

2.2:uuid索引的内部结构:因无规律性,新行位置需动态分配,导致大量额外操作。数据分布不均,增加页分裂,页分裂导致数据移动,插入效率低。

2.3:自增ID的缺点:暴露业务增长信息、并发插入导致锁争用、自增锁机制性能损失。优化需要调整innodb_autoinc_lock_mode配置。

使用innodb时,应按照主键自增顺序插入,并尽可能使用单调递增的聚簇键值。

三:总结

本文从提出问题、建表至使用jdbcTemplate测试不同ID生成策略,深入分析ID机制在mysql索引结构中的表现及其优缺点。详细解释了uuid和随机不重复ID在数据插入中的性能损耗,强调在实际开发中,遵循mysql官方推荐使用自增ID。mysql内部优化点众多,值得深入学习。2024-11-03
mengvlog 阅读 578 次 更新于 2025-09-08 22:20:28 我来答关注问题0
  •  翡希信息咨询 【MySQL】mysql中不推荐使用uuid或者雪花id作为主键的原因以及差异化对比

    不推荐使用雪花ID作为主键的原因: 依赖机器时钟:雪花ID的生成依赖机器时钟,如果机器时钟出现问题,可能导致生成的ID不唯一。 存储空间占用同样较大:虽然雪花ID比UUID短,但相比自增ID,其存储空间占用仍然较大。自增ID与UUID、雪花ID的差异化对比: 生成与管理:自增ID由数据库自动管理,生成简单且唯...

  • UUID和雪花算法在生成时并非递增序列,在未进行分库分表的情况下使用它们作为数据库主键可能导致MySQL的页分裂问题和磁盘的随机读问题。然而,雪花算法在分布式数据库中作为主键是主流实现方案。我们需要了解分布式ID的原因是,当系统数据量过大并已完成分库分表后,需要对分散在各个库表中的数据记录进行唯一...

  • 在mysql中可以把UUID作为逻辑主键,物理主键依然使用自增ID 1、UUID定义 UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部分。UUI...

  • 在MySQL中生成UUID主键,可以使用UUID()函数。该函数会生成一个标准的UUID字符串,格式为8-4-4-12的十六进制数字和字母组成的字符串。我们可以在INSERT INTO和REPLACE INTO语句中使用UUID函数生成主键,如下所示:INSERT INTO `table_name` (`id`, `name`, `age`) VALUES (UUID(), ‘张三&...

  •  阿暄生活 laravel雪花id怎么变短点

    替代方案如下:使用哈希ID:原理:通过对原始雪花ID进行哈希处理,生成一个较短的字符串ID。特点:哈希ID的长度通常比原始雪花ID短,但可能会牺牲ID的有序性。这意味着哈希后的ID无法直接反映生成时间或顺序。使用UUID并优化表示:原理:UUID是一种128位的唯一标识符,通常表示为36个字符的字符串(包括4...

檬味博客在线解答立即免费咨询

mySQL相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部