You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL多列倒序ORDER BY未用索引的游标分页优化问题

PostgreSQL游标分页:上一页查询索引优化问题

在PostgreSQL 10.20中实现游标分页,目标是对非唯一列排序时也能实现高效分页。目前在获取指定游标对应的上一页数据时遇到性能瓶颈,测试所用表数据量超300万条。

测试表结构

CREATE TABLE "placemarks" (
    "id" serial NOT NULL DEFAULT,
    "assetId" text,
    "createdAt" timestamptz,
    PRIMARY KEY ("id")
);

现有索引

  • id字段已创建主键索引
  • assetId字段已创建单独索引

下一页查询(执行高效)

基于assetId和id组成的游标获取下一页数据的查询执行高效,能正常使用索引,可处理assetId重复值:

SELECT
    *
FROM
    "placemarks"
WHERE
    "assetId" > 'CURSOR_ASSETID'
    or("assetId" = 'CURSOR_ASSETID'
        AND id > CURSOR_INT_ID)
ORDER BY
    "assetId",
    id
LIMIT 5;

执行计划显示使用索引,耗时仅0.194ms。

上一页查询(存在性能问题)

获取上一页数据的查询未使用索引,执行效率极低:

SELECT
    *
FROM
    placemarks
WHERE
    "assetId" < 'CURSOR_ASSETID'
    or("assetId" = 'CURSOR_ASSETID'
        AND id < CURSOR_INT_ID)
ORDER BY
    "assetId" desc,
    id desc
LIMIT 5;

执行计划显示进行全表扫描;执行SET enable_seqscan = OFF;强制使用索引后,查询耗时降至0.918ms。

问题:如何优化该上一页查询,使其始终使用索引?

内容的提问来源于stack exchange,提问作者bertonc96

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:45:35