Hacker News 中文摘要

RSS订阅

UUIDv7 登陆 PostgreSQL 18 -- UUIDv7 Comes to PostgreSQL 18

文章摘要

PostgreSQL 18即将发布,目前正在进行测试。此次更新引入了UUIDv7支持,这是一种基于时间戳的UUID变体,与btree索引兼容良好。UUIDv7功能备受期待,尽管未在17版本中实现,但此次更新满足了用户需求。此外,新版本还包括异步I/O、多列btree索引优化、虚拟生成列等多项改进。

文章总结

PostgreSQL 18 引入 UUIDv7 支持

PostgreSQL 18 即将发布,目前正在进行 Beta 测试。此次更新中,最引人注目的功能之一是对 UUIDv7 的支持。UUIDv7 是一种基于时间戳的 UUID 变体,能够与 B-tree 索引良好配合。本文将探讨 UUID 的基本概念、UUIDv7 的优势及其在 PostgreSQL 中的应用。

PostgreSQL 18 的新特性

PostgreSQL 18 Beta 1 已经发布,带来了众多新功能、改进和错误修复。此次更新的亮点包括:

  • 异步 I/O(使用 io_uring):顺序扫描和清理操作速度提升 2-3 倍。
  • 多列 B-tree 索引的跳过扫描:更智能的 OR/IN 优化。
  • 主版本升级时保留规划器统计信息
  • UUIDv7 函数
  • 虚拟生成列
  • OAuth 登录:弃用 md5 的警告。
  • EXPLAIN ANALYZE:现在显示 I/O、CPU 和 WAL 信息。
  • 时间约束:非确定性排序规则上的 LIKE 操作,大小写折叠。
  • 新的有线协议版本 3.2:自 2003 年以来的首次更新。

尽管 uuidv7() 并不是最令人兴奋的功能(异步 I/O 才是),但它可能是最受期待的功能之一。许多用户曾对它在 PostgreSQL 17 中未能加入感到失望,因此它的到来备受关注。

UUID 的基本概念及其优势

UUID 是 128 位的唯一标识符,广泛用于分布式数据库、不可猜测的公共标识符以及客户端生成标识符等场景。与传统的自增 ID 相比,UUID 具有以下优势:

  • 分布式数据库中的唯一 ID 生成:无需依赖集中式服务。
  • 不可猜测的公共标识符:防止攻击者猜测或推断系统信息。
  • 客户端生成标识符:减少与服务器的通信,适用于移动应用和无服务器环境。

然而,UUID 也存在一些缺点,如排序困难、索引局部性差以及占用空间较大。UUIDv7 则解决了其中的排序和索引局部性问题。

UUIDv7 的优势

UUIDv7 使用 Unix 时间戳作为其最高有效位,确保 UUID 按时间顺序排序,并具有良好的索引局部性。这使得它非常适合作为数据库的主键,既能保证唯一性,又能提高性能。

PostgreSQL 18 中的 UUIDv7 实现

PostgreSQL 18 新增了 uuidv7() 函数,用于生成 UUIDv7 值。该实现包括一个 12 位的亚毫秒时间戳部分,确保同一会话中生成的 UUIDv7 值具有单调性。此外,PostgreSQL 18 还更新了提取 UUID 时间戳和版本号的函数,以支持 UUIDv7。

使用示例

在表中使用 uuidv7() 作为主键非常简单,且可以轻松提取时间戳,方便排序和记录创建时间的检查。

```sql CREATE TABLE test ( id uuid DEFAULT uuidv7() PRIMARY KEY, name text );

INSERT INTO test (name) VALUES ('foo'); INSERT INTO test (name) VALUES ('bar'); INSERT INTO test (id, name) VALUES (uuidv7(INTERVAL '-1 hour'), 'oldest');

SELECT uuidextracttimestamp(id), name FROM test ORDER BY id; ```

结语

PostgreSQL 18 的 UUIDv7 支持是一个低调但影响深远的改进,解决了数据库设计中的长期痛点。UUIDv7 结合了全局唯一性和良好的索引局部性,使其成为主键的理想选择。如果你曾犹豫是否使用 UUID 作为主键,现在正是重新考虑的好时机。不妨尝试 Beta 版本,测试其在你的架构中的表现,并积极参与社区反馈,共同塑造 PostgreSQL 的未来。

评论总结

评论主要围绕UUIDv7的使用展开,观点分为支持和反对两派。

反对使用UUIDv7作为主键的观点: 1. 安全性问题:UUIDv7的时间顺序性可能导致安全问题,特别是在面向用户的应用程序中。
- "UUIDv7 time is too problematic for security, so we prefer binary-stored UUIDv4 even though it's less efficient." (评论2)
- "If you add sequential ordering, won't that defeat the purpose?" (评论4)

  1. 性能问题:UUIDv7在插入和连接操作上较慢,不如BIGSERIAL高效。
    • "UUIDv7 is slower at inserts and joins, so we prefer BIGSERIAL for primary key." (评论2)

支持使用UUIDv7的观点: 1. 优化可能性:有评论提出是否可以对UUIDv7主键和date_created列进行优化。
- "Does anyone know if there are any sorts of optimizations for a table with a UIIDv7 PK and a date_created column?" (评论3)

  1. 现实应用:有评论认为大多数讨论脱离实际,UUIDv7可能有其独特优势。
    • "95% of the comments here have nothing to do with reality." (评论6)

中立观点: 1. UUID类型差异:不同类型的UUID(如类型1)可能具有不同的特性,不能一概而论。
- "This depends very much on the type of UUID e.g. a type 1 UUID is just a timestamp, a MAC address and a 'collision' counter." (评论5)

总结:UUIDv7在安全性和性能上存在争议,支持者认为其可能有优化空间,而反对者则强调其在面向用户应用中的潜在风险。