我有一个名为
event
的表,其中包含 id
(uuidv4)、name
、description
、created_at
和 updated_at
列。
我正在尝试理解“按键集分页”。这是我现在的理解:
基础查询(第一页):
SELECT *
FROM event
ORDER BY created_at, id ASC
LIMIT 3
第二个查询(第二页):
SELECT *
FROM event
WHERE (created_at, id)
> ('2024-02-09 14:21:52+00', '7aa20cad-3a8f-45cb-bee2-2115d4ad1c20')
ORDER BY created_at, id ASC
LIMIT 3;
这非常有效。但我有一些我不明白的用例。
当我想通过
created_at DESC
或 id DESC
订购时会发生什么?
如果我想通过
name DESC
订购,该如何操作?
SELECT * from event ORDER BY name DESC, created_at, id ASC LIMIT 3
。但是当使用游标获取时它是如何工作的呢?我知道我必须在光标中包含名称,但我不明白元组过滤器会是什么样子:
SELECT *
FROM event
WHERE (name created_at, id)
> ('Name 9', '2024-02-09 14:21:52+00', '7aa20cad-3a8f-45cb-bee2-2115d4ad1c20')
ORDER BY created_at, id ASC
LIMIT 3;
像这样?但是
<
或 >
运算符与排序不相关吗?
有人可以指出可以很好解释的资源,或者在这里解释吗?
具有索引支持的“键集分页”(唯一表现良好的类型)基于行构造函数比较。该比较对行中的每个字段使用相同的运算符。并且索引必须同意这一点:以相同的顺序使用相同的字段,并且全部按升序或降序排序。 您不能在查询或索引中混合升序和降序。 请参阅:
因此,谨防排序顺序中未定义的列
NOT NULL
。 NULL
默认排序在最后 ASCENDING
排序顺序(以及第一个 ind DESCENDING
顺序),但行值比较如下:
WHERE (name, created_at, id) > ('Name 9', '...', '...')
... 完全排除
name
中具有空值的行。 说明书:
对于
、<
、<=
和>
情况,比较行元素 从左到右,一旦元素对不相等或为空就停止 被发现。如果这对元素中的任何一个为 null,则结果为 行比较未知(空);否则比较这个 元素对决定结果。例如,>=
产生 true,而不是 null,因为第三对元素 不予考虑。ROW(1,2,NULL) < ROW(1,3,0)