讲师中心 微信公众号
AI工具推荐 视频效率加速

怎样在PostgreSQL中实现分页查询_通过LIMIT与OFFSET组合实现

云浩同学_5595

云浩同学_5595

发布时间:2026-04-24 11:22:41

|

202人浏览过

|

来源于php中文网

原创

OFFSET越大查询越慢,因PostgreSQL需真实扫描并丢弃前OFFSET行;应改用游标分页(如WHERE id>12345 ORDER BY id LIMIT 20),配合唯一排序字段和索引以保证性能与稳定性。

怎样在postgresql中实现分页查询_通过limit与offset组合实现

为什么 OFFSET 越大,查询越慢

因为 PostgreSQL 必须先扫描并跳过前 OFFSET 行,才能返回后续结果。比如 OFFSET 1000000,数据库就得真实读取并丢弃前一百万行——哪怕只想要 20 条。这和索引是否覆盖无关,是执行计划层面的硬开销。

常见错误现象:EXPLAIN ANALYZE 显示 Seq Scan 或 Index Scan 的 Rows Removed by Filter 高得离谱;响应时间随 OFFSET 线性增长。

  • 适用场景:仅限小数据集(OFFSET
  • 若主键连续、无删改,可考虑用 WHERE id > last_seen_id LIMIT 20 替代(游标分页)
  • 加 ORDER BY id 是必须的,否则 OFFSET 结果不可预测

LIMIT 和 OFFSET 的参数顺序不能颠倒

LIMIT 必须在 OFFSET 前面,语序固定为 LIMIT n OFFSET m。写成 OFFSET m LIMIT n 在某些旧版本(如 9.4 之前)会报错,新版本虽兼容但属非标准写法,不建议依赖。

示例正确写法:

SELECT * FROM users ORDER BY id LIMIT 20 OFFSET 100;

  • LIMIT 20 OFFSET 100 ✅ 标准且稳定
  • OFFSET 100 LIMIT 20 ⚠️ 语法上可能通过,但易引发团队理解偏差
  • 省略 OFFSET 时,LIMIT 20 等价于 LIMIT 20 OFFSET 0

ORDER BY 缺失会导致分页结果混乱

没有 ORDER BY,PostgreSQL 不保证行的返回顺序,同一查询多次执行可能拿到不同“第 21–40 行”,OFFSET 就失去意义。

更隐蔽的问题:即使表有主键,也不代表查询自动按主键排序。显式写 ORDER BY id 才可靠。

  • 如果排序字段有重复值(如多个用户同一天注册),需补一个唯一字段消歧,例如 ORDER BY created_at, id
  • 避免在 ORDER BY 中使用函数或表达式(如 ORDER BY LOWER(name)),除非该表达式有对应函数索引,否则无法高效走索引
  • 复合排序字段顺序要和索引定义一致,否则索引可能失效

用游标分页替代 OFFSET 的实际写法

当需要稳定、高性能的深分页时,应放弃 OFFSET,改用基于上一页最后一条记录的“游标”方式。核心是把 OFFSET 的“跳过 N 行”逻辑,转为“从某条记录之后取 N 行”。

假设上一页最后一条是 id = 12345,下一页查询:

SELECT * FROM users WHERE id > 12345 ORDER BY id LIMIT 20;

  • 必须确保 WHERE 条件和 ORDER BY 字段一致(如都用 id),且该字段有索引
  • 前端需保存上一页末尾的 id(或其他唯一排序字段值),不能只记页码
  • 不支持直接跳转到第 100 页,但支持无限向下翻页,且性能恒定

游标分页的边界情况比 LIMIT/OFFSET 多——比如删除导致“断号”、并发插入影响可见性。这些细节不处理好,反而比 OFFSET 更难调试。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4583

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

951

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1209

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6561

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3323

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6540

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

8981

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1210

2024.04.29

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn