【发布时间】:2019-11-19 21:07:34
【问题描述】:
我想以最好的方式对包含 10k+ 个寄存器的用户表进行分页。我可以使用偏移量和限制,但正如我在许多文章中看到的那样,它显然不是很好。偶然发现了键集和光标分页,我认为键集可能更合适,因为它更容易在 API 中实现(我使用 golang)。问题是键集是如何工作的,据我所知,id(主键)被索引,然后用于跨数据库查询:
select * from users where id > ? order by id limit ?
但是,这似乎只在整数自动增量 ID 中可行,这不是我的情况,我使用的是 UUID (v4)。 我怎样才能实现这个键集分页?
【问题讨论】:
-
那里没有任何东西只限于整数。你可以使用 UUID 就好了。这确实意味着您必须按 UUID 顺序翻页,这可能不是最自然的排序方式。但是你有一个你想要的自然顺序,你需要提到它。
-
假设我会按名称订购。我需要设置索引,获取第一次加载的数据(限制500),然后获取最后一个ID,并在where id > ID? select * from user where id > ? (我猜这是空的)限制 500; select * from user where id > uuidfromlastrow limit 500;
-
如果您想订购名称,那么您只需将 uuid 用作决胜局,而不是主要。
WHERE (name, id)>(?,?) order by name, id limit 500 -
我只是想命令它进行分页,真正的排序将在客户端使用请求片段完成(很好的例子quasar.dev/vue-components/…)。我在您的代码中看到了一些带有日期(created_at/updated_at)的示例,uuid 如何在该查询中进行交互?如果我按日期过滤,uuid 不会没用吗?
标签: postgresql indexing uuid