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
相关产品推荐
相关产品推荐

