0

0

SQL分页查询怎么优化_高频场景实例讲解便于理解使用【教学】

冷漠man

冷漠man

发布时间:2025-12-23 19:17:02

|

633人浏览过

|

来源于php中文网

原创

SQL深分页慢的根源是OFFSET需扫描跳过大量行,优化应采用游标分页(基于排序字段值范围查询)或延迟关联(先查ID再关联),并确保索引匹配排序顺序。

sql分页查询怎么优化_高频场景实例讲解便于理解使用【教学】

SQL分页查询慢,核心问题往往不是“LIMIT OFFSET”本身,而是数据库要先扫描跳过大量行才能拿到目标数据。尤其在百万级以上表、深分页(比如OFFSET 100000)时,性能断崖式下跌。优化关键:避免全表扫描跳过,改用“游标分页”或“延迟关联”,同时确保索引真正生效。

为什么 OFFSET 越大越慢?

比如 SELECT * FROM orders ORDER BY create_time DESC LIMIT 20 OFFSET 100000,MySQL 必须先按 create_time 排序,再逐行数满 100000 条,才取后面 20 条——前面 10 万行全做了无效扫描。

常见误区:
- 加了 ORDER BY 字段的索引就一定快?不一定。如果 SELECT * 包含未索引字段,InnoDB 还得回表;
- 用主键排序分页就安全?OFFSET 大了照样慢。

推荐方案一:游标分页(最有效,适合“下一页”场景)

不依赖 OFFSET,而是记住上一页最后一条的排序值(如时间戳或ID),下一页直接查“比它更小/更大的记录”。要求排序字段唯一且有索引(推荐用自增主键或带唯一约束的时间+ID组合)。

  • 第一页:SELECT * FROM posts ORDER BY id DESC LIMIT 20
  • 第二页(已知上一页最后 id = 10050):SELECT * FROM posts WHERE id
  • 优势:每次都是索引范围查询,复杂度 O(log N),100万条也能毫秒响应
  • 注意:不能跳页(如直接跳到第100页),也不支持倒序“上一页”(需额外缓存上一页最小值)

推荐方案二:延迟关联(兼容跳页,适合管理后台)

把分页逻辑“拆开”:先用覆盖索引快速定位 ID,再用这些 ID 回查完整数据。大幅减少回表和扫描行数。

PixVerse
PixVerse

PixVerse是一款强大的AI视频生成工具,可以轻松地将多种输入转化为令人惊叹的视频。

下载

原低效写法:
SELECT * FROM users ORDER BY reg_time DESC LIMIT 20 OFFSET 50000

优化后:
SELECT u.* FROM users u
INNER JOIN (SELECT id FROM users ORDER BY reg_time DESC LIMIT 20 OFFSET 50000) t
ON u.id = t.id;

说明:
- 子查询只查 id(假设 id 和 reg_time 都在联合索引里),走索引,不回表;
- 主查询只用主键 ID 关联,回表次数从 50020 次降到 20 次;
- 索引建议:INDEX(reg_time, id)(顺序很重要,让 ORDER BY + LIMIT 走索引)

避坑提醒:这些细节决定成败

  • ORDER BY 字段必须有索引,且索引顺序要匹配排序方向(如 ORDER BY a ASC, b DESC,索引也要对应)
  • 避免在分页字段上用函数或表达式,例如 ORDER BY DATE(create_time) —— 索引失效
  • 深分页慎用 COUNT(*) 总数统计,可改用估算(如 SHOW TABLE STATUS)或业务妥协(“只显示前N页”)
  • PostgreSQL 用户可用 cursor + FETCH NEXT 原生支持游标分页,更简洁

基本上就这些。游标分页适合 Feed 流、日志列表等线性浏览场景;延迟关联适合需要任意跳页的后台系统。选对方法,分页从秒级降到毫秒级很常见。

相关专题

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

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

679

2023.10.12

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

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

320

2023.10.27

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

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

346

2024.02.23

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

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

1095

2024.03.06

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

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

357

2024.03.06

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

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

675

2024.04.07

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

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

573

2024.04.29

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

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

415

2024.04.29

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 793人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号