如何在 postgresql 中对 UUID 进行键盘分页?

Nat*_*ira 4 postgresql indexing uuid

我想以尽可能最好的方式对具有 10k+ 个寄存器的用户表进行分页。我可以使用偏移量和限制,但它显然不如我在许多文章中看到的那样好。偶然发现了键集和光标分页,我认为该键集可能更适合,因为它更容易在 API 中实现(我使用 golang)。问题是键集是如何工作的,从我所看到的,id(主键)被索引,然后用于跨数据库查询:

select * from users where id > ? order by id limit ?
Run Code Online (Sandbox Code Playgroud)

但是,这似乎只适用于整数自动增量 ID,这不是我的情况,我使用的是 UUID (v4)。我怎样才能实现这个键集分页?

Lau*_*lbe 7

这将与 UUID 相同。假设id是UUID主键列,可以这样写

SELECT ... FROM ...
WHERE (order_col1, order_col2, id) > (<previous values>)
ORDER BY order_col1, order_col2, id
LIMIT <page size>;
Run Code Online (Sandbox Code Playgroud)

上的索引可以支持此查询(order_col1, order_col2)

  • @EugeneKim我不认为有一个特殊的名称,它是*行表达式*或*复合类型*的比较。我不知道文档是否具体涵盖了这一点,但比较是*字典顺序*:首先,比较第一个元素。如果这还不足以确定结果,则比较第二个元素,依此类推。 (3认同)
  • 我不知道你可以在单个 Postgresql 表达式中比较多个值!我想在他们的文档中了解更多相关信息。这种比较叫什么?`WHERE (order_col1, order_col2, id) &gt; (&lt;先前值&gt;)` (2认同)
  • 感谢您的回复@LaurenzAlbe。如果官方文档中提到了一些内容,那就太好了,但在堆栈溢出和像您这样乐于助人的人的世界中,也许这并不那么重要。干杯! (2认同)