目录
一、场景
财政部金财工程平台在代理行日终结算时,经常出现磁盘的IO异常,导致经常出现高延迟。
这个问题一直困扰我们很长时间,对比发现在大量数据新增时磁盘IO居高不下,多次测试后发现是UUID主键在搞鬼。
二、UUID的版本
2.1 基于时间的UUID
- 能保证不同设备UUID是唯一的
- 在同一设备上生成UUID可能重复
2.2 DCE安全的UUID
- DCE(身份验证和安全服务)
- 涉及侵犯用户隐私
- 有损时间戳导致精度丢失
2.3 基于命名空间的UUID(MD5、SH1)
- 在相同的命名空间下可能会出现UUID冲突
2.4 基于随机数的UUID(最常用)
- 完全随机生成,会存在极小概率重复的情况
- 与外部环境无关,不涉及环境信息
- 生成内容无序无规律
- 目前的主流做法
三、为什么 UUID 会引起IO异常
UUID是无序的,当UUID可能在索引中间某一页插入数据时
新增记录所在的数据页已满,数据库需要申请一个新的数据页存储数据
这种现象被称为"页分裂"
页分裂确保后一个数据页中的所有的 ID 值一定比数据页中的 ID 值大
在大并发环境环境下增加了磁盘IO的压力,无序ID才是罪魁祸首
解决办法:改为有序的数字主键生成策略就可以了
如美团Leaf / 推特Snowflake