在大型表中使用 OFFSET 优化慢速 PostgreSQL 查询 在针对大型 PostgreSQL 表的查询中使用 OFFSET 通常会导致性能瓶颈。本文解决了这个问题,重点介绍 PostgreSQL 9.5 及更高版本的优化策略。 挑战: 想象一个巨大的表,big_table,包含大量记录。 您需要使用 ORDER BY 和 OFFSET 检索分页数据。即使使用适当的索引(例如 vote_order_asc 和 vote_order_desc),当 OFFSET 值较大时,性能也会显着下降。 解决方案:键集分页 PostgreSQL 无法直接跳过具有大 OFFSET 值的行,因此需要在达到目标偏移量之前对所有行进行排序和计数。 为了克服这个问题,请使用使用行值比较的键集分页: SELECT * FROM big_table WHERE (vote, id) > (vote_x, id_x) ORDER BY vote, id LIMIT n; 此方法需要 (vote, id) 的独特组合才能获得一致的结果。 vote_order_asc 索引在这里证明是有用的。 关键对齐: 保持 ORDER BY 方向和 WHERE 子句中的比较运算符之间的一致性。 例如,如果 WHERE 使用 >,那么 ORDER BY 应该使用 ASC。 进一步考虑: 虽然这种键集分页方法提供了显着的性能改进,但必须承认其局限性: 假定(vote, id) 是唯一的。 表的并发更新可能需要进一步分析以选择最佳策略。 对于频繁并发修改的复杂场景,更详细的调查对于确定最有效的优化方法至关重要。