Dan*_*iel 5 postgresql query pagination
我在我的 Postgres 数据库上使用 uuids 的键集分页方法,如本文所述:
但是,我注意到当我有两条日期相同的记录时,会从结果中跳过行。
例如,当我运行查询时:
SELECT id, created_at FROM collection
ORDER BY created_at DESC, id DESC
Run Code Online (Sandbox Code Playgroud)
我按照我的预期取回了记录,作为created_at主要顺序,然后id充当决胜局:
| ID | 创建时间 |
|---|---|
| e327847a-7058-49cf-bd91-f562412aedd9 | 2022-05-23 23:07:22.592 |
| d35c6bb8-06dd-4b86-b5c6-d123340520e2 | 2022-05-23 23:07:22.592 |
| 5167cf95-953f-4f7b-9881-03ef07adcf3c | 2022-05-23 23:07:22.592 |
| d14f48dc-df22-4e98-871a-a14a91e8e3c1 | 2022-05-23 23:07:21.592 |
但是,当我运行查询来分页时,例如:
SELECT id, created_at
FROM collection
WHERE (created_at, id) < ('2022-05-23 23:07:22.592','d35c6bb8-06dd-4b86-b5c6-d123340520e2')
ORDER BY created_at DESC, id DESC
LIMIT 3
Run Code Online (Sandbox Code Playgroud)
我希望取回最后两条记录,但我的结果集是
| ID | 创建时间 |
|---|---|
| d14f48dc-df22-4e98-871a-a14a91e8e3c1 | 2022-05-23 23:07:21.592 |
我还尝试了查询的一些变体来尝试修复它,例如:
SELECT id, created_at
FROM collection
WHERE created_at < '2022-05-23 23:07:22.592' OR
(created_at = '2022-05-23 23:07:22.592' AND id < 'd35c6bb8-06dd-4b86-b5c6-d123340520e2')
ORDER BY created_at DESC, id DESC
Run Code Online (Sandbox Code Playgroud)
但我仍然得到相同的结果集。
我的查询发生了什么?
您显示的任何一个查询都应返回两行,如预期的那样:
db<>在这里摆弄
如果您看到不同的结果,则可能的原因是索引损坏。测试:
SELECT id, created_at
FROM collection
WHERE (created_at + interval '1 ms', id)
< ('2022-05-23 23:07:22.592','d35c6bb8-06dd-4b86-b5c6-d123340520e2')
ORDER BY created_at + interval '1 ms' DESC, id DESC
LIMIT 3;
Run Code Online (Sandbox Code Playgroud)
这将“禁用”索引支持并获取顺序扫描的结果。看:
如果是这样,请修复:
REINDEX TABLE collection;
Run Code Online (Sandbox Code Playgroud)
或者只是涉及的索引(created_at, id)。
我自己几乎从未见过索引损坏。通常,存在令人不安的根本原因,例如硬件故障(RAM、存储)或 Postgres 版本非常旧。尝试查找并解决原因。
这可能是首先备份数据库的好时机。
有关的:
| 归档时间: |
|
| 查看次数: |
1329 次 |
| 最近记录: |