性能提升超100%!PostgreSQL主键选择大变革:UUIDv7能否终结v4的统治?

大家好,这里是架构资源栈 !点击上方关注,添加"星标",一起学习大厂前沿架构!

关注、发送C1即可获取JetBrains全家桶激活工具和码!

大家好,我是小D。

在数据库圈子里,UUID 一直是一个颇具争议的话题。 UUIDv4 随机分布的特性在并发写入时能避免热点,但在大规模批量插入时,它带来的索引分裂和磁盘写放大,往往会让 DBA 头疼不已。

而 PostgreSQL 18(目前还在 beta 阶段)引入的 UUIDv7,凭借时间序列前缀,让索引写入更紧凑,批量导入场景的性能表现可以说相当炸裂。最近有实测对比数据,就直接揭示了这两种 UUID 在大规模导入中的差距。


UUIDv7 的出现:顺序 + 全局唯一

UUIDv7 的关键变化在于:

  • 带有时间戳前缀 → 新生成的 UUID 基本上是递增的,更利于顺序写入;
  • 仍然保持唯一性 → 和 v4 一样,可以跨应用直接生成;
  • 与 v4 同属 uuid 类型 → 两者可以共存于同一列,无需改表结构。

这意味着在单次大批量导入时,UUIDv7 可以避免随机键值带来的频繁索引分裂,让磁盘和缓存的利用率更高。


实测:1,000 万行批量导入

测试环境中,研究者跑了一个脚本,向 PostgreSQL 中插入 1,000 万行数据 ,分别使用 uuidv7() 和 uuidv4() 作为主键,统计插入速率、索引大小和 WAL(Write Ahead Log)写入情况。

脚本简化后大概是这样:

sql 复制代码
create table demo ( 
    id uuid default uuidv7() primary key,
    -- id uuid default uuidv4() primary key,
    value text
);

-- 利用 COPY 插入千万行随机数据
\! psql -c "copy demo(value) from program 'base64 -w 100 /dev/urandom | head -10000000'" &

后台 COPY 数据,前台则定时用 pg_stat_progress_copy 监控吞吐和写入情况。


UUIDv7:平稳高效,3 分钟完成

在使用 UUIDv7 的测试结果中:

  • 吞吐率长期稳定在 7~9 MB/s,偶尔小幅波动;
  • WAL 写放大系数稳定在 2.5x 左右;
  • 索引增长曲线光滑紧凑,没有明显碎片;
  • 1,000 万行导入仅耗时 3 分多钟。

这得益于 UUIDv7 顺序性,B+Tree 索引写入非常紧凑,磁盘和缓存利用率极高。


UUIDv4:断崖式下滑,耗时翻倍

再看 UUIDv4 的结果:

  • 初始吞吐尚可,但很快出现大幅下滑,插入速率断断续续;
  • 索引页频繁分裂,导致体积比 UUIDv7 更大;
  • WAL 写入有时暴涨到 19 倍数据量,源于全页写和频繁索引维护;
  • 最终耗时超过 7 分钟,是 UUIDv7 的两倍多。

可见,UUIDv4 随机分布在高并发场景有优势,但在批量导入时却成了拖累。


喜欢就奖励一个"👍"和"在看"呗~

本文由博客一文多发平台 OpenWrite 发布!

相关推荐
aloha_78912 分钟前
Java 基础、集合、异常与 JUnit 5 速查
java·junit·sqlserver
知守观1 小时前
设计模式实战:从真实老项目中看标准模板方法与工厂的落地
java·spring·设计模式
独隅1 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
SL_staff1 小时前
JVS私有化文档系统上线避坑指南:5大运维与业务协同断点及检测加固实践
java·开源·全栈
FinelyYang3 小时前
考试系统简答题 AI 阅卷:覆盖度驱动、异步评分与人机协同落地实践
java·大数据·人工智能
hhhjhl3 小时前
Yup 跨端三方库仓颉适配全流程
java·开发语言
用户3126874877203 小时前
Java 对象内存布局:压缩指针、对齐填充与 JOL 实测
java
东华果汁哥4 小时前
【Spring AI 实战】从零开始调用大模型接口,构建 Java AI 应用
java·人工智能·spring
Song_RsHt4 小时前
Redis 与微服务,什么场景下无可替代
java·redis·后端·学习·微服务