性能提升超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 发布!

相关推荐
瓯雅爱分享16 小时前
基于Java后端与Vue前端的MES生产管理系统,涵盖生产调度、资源管控及数据分析,提供全流程可视化支持,包含完整可运行源码,助力企业提升生产效率与管理水平
java·mysql·vue·软件工程·源代码管理
hello_25018 小时前
k8s安全机制解析:RBAC、Service Account与安全上下文
java·安全·kubernetes
望获linux19 小时前
【实时Linux实战系列】实时安全 C++ 模式:无异常、预分配与自定义分配器
java·linux·服务器·开发语言·数据库·chrome·tomcat
多多*19 小时前
linux安装hbase(完)
java·分布式·算法·c#·wpf
new_daimond19 小时前
设计模式-享元模式详解
java·设计模式·享元模式
软件柠檬20 小时前
Java中Integer是如何应用享元模式的?
java·享元模式
Taylor不想被展开20 小时前
SpringBoot 项目集成 Flyway
java·spring boot·mysql
大数据0021 小时前
Flink消费Datahub到ClickhouseSink
java·前端·flink
观望过往21 小时前
Spring Boot 高级特性:从原理到企业级实战
java·spring boot
喂完待续21 小时前
【序列晋升】38 Spring Data MongoDB 的统一数据访问范式与实践
java·spring·spring cloud·big data·序列晋升