研发强烈反对用自增id,坚持用uuid做主键,该怎么办?
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
最近,公司刚刚开了一个新项目,研发丢过来的建表语句,一看全都是uuid做主键。。。 头大,想要研发改成自增id,结果研发来一句,自增id不利于数据安全。 对于一个对数据安全要求高的公司来说,这一句秒杀了。 但是,此题还得解。 本期就说说自增id和uuid的优劣,以及最后的解决方案。 核心要点 1. 为什么用自增ID 2. 自增ID的优缺点 3. UUID的优缺点 4. 解决方案 5. 总结 为什么用自增ID 为什么DBA总是强调要用自增id做主键? 这也是研发同学一直以来的疑问,一般DBA会说基于性能考虑。具体为什么,可能也没详细解释过。今天,简单明了地解释一下。 MySQL数据如何存储: clustered index The In the Oracle Database product, this type of table is known as an index-organized table. 首先, 官方手册中关于聚集索引有详细的说明 InnoDB表存储基于主键列的值进行组织 这类表又称之为索引组织表 总结一句话就是:MySQL的innodb表的数据是按照主键的顺序进行存储的。 其次, MySQL数据库在磁盘上按数据页进行存储的,每个数据页的默认大小为16k 有序主键和无序主键的区别: 1. 有序主键(例如自增ID)存储性能:
查询性能:
2. 无序主键(例如UUID)存储性能:
查询性能:
自增ID的优缺点 优点:
缺点:
UUID的优缺点 优点: 全局唯一性:UUID能够在分布式系统中保证唯一性,而无需依赖中心化的ID生成服务。 支持分布式环境:在分布式架构中,UUID特别适合用于跨数据库实例的记录合并,不会引起主键冲突。 数据迁移灵活性:数据迁移、跨系统整合等操作更简单,不需要重新生成主键或做ID映射。 避免信息泄露:UUID的随机性避免了可能会暴露插入的顺序或数量这一风险,增强了数据的安全性。 插入性能低:UUID是无序的随机字符串,在B+树等结构中不能按顺序插入,导致频繁的页分裂,增加了数据库索引的维护开销,影响插入性能。 占用存储空间大:UUID通常为128位的字符串,存储时比自增整数(4字节或8字节)更占用空间。 查询性能差:因为UUID是无序的,基于UUID的范围查询性能低。UUID在数据页中分布分散,导致更多的磁盘随机读取,而不是连续读取,增加了IO负担。 排序和对比成本高:UUID长度较长,进行排序和比较的成本也较高,尤其在需要频繁排序的场景中,性能开销更大。 阅读性差:UUID是随机生成的长字符串,可读性差,不易辨识和调试,增加了手动操作或日志分析的难度。 解决方案 了解了两种方案的优缺点,接下来就是要取舍了,如何平衡各方?
最后决定采用 UUID v7 UUIDv7特点:
以目前公司新项目为例,之前采用java的hutool工具生成uuid,同样支持uuidv7。只需要更换一个调用方法即可,代码修改量极小。 总结
该文章在 2024/11/4 10:34:50 编辑过 |
相关文章
正在查询... |