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

为什么SQL深度分页查询越往后翻页速度越慢应该怎么解决?

轻丽同学_1390

轻丽同学_1390

发布时间:2026-07-20 06:21:57

|

891人浏览过

|

来源于php中文网

原创

MySQL的LIMIT offset, size越往后越慢是因为offset大导致数据库必须从头扫描并丢弃大量数据,如LIMIT 1000000,20需读取至少1000020行再丢弃前100万行,引发I/O、回表、排序等开销;优化方案包括游标分页(WHERE id > last_id)和延迟关联(先查ID再JOIN)。

为什么sql深度分页查询越往后翻页速度越慢应该怎么解决?

MySQL的LIMIT offset, size为什么越往后越慢

不是“LIMIT慢”,是offset大导致数据库必须从头扫描并丢弃大量数据。比如LIMIT 1000000, 20,MySQL仍要读取至少1000020行(含索引页和数据页),再丢掉前100万行——这些被丢弃的行照样走I/O、触发回表、参与排序,CPU和磁盘压力一点没少。

常见错误现象:EXPLAIN显示rows值随offset线性增长;Handler_read_next陡增;慢查询日志里query_time从毫秒级跳到几秒甚至超时。

  • 即使ORDER BY字段有索引,优化器也常因统计信息不准或谓词复杂放弃索引覆盖扫描
  • 若SELECT *且索引不覆盖,每条被跳过的记录都可能触发一次回表,随机I/O雪崩
  • sort_buffer_size不足时,排序阶段会写磁盘临时文件,性能断崖下跌

用WHERE id > last_id替代OFFSET实现游标分页

这是目前最稳定、可扩展性最强的方案,适用于时间线、Feed流、订单列表等“向下滚动”场景。

核心前提是排序字段必须单调且唯一(推荐主键或created_at, id组合)。

  • 第一页:SELECT * FROM orders WHERE status = 'paid' ORDER BY id LIMIT 20
  • 拿到最后一条的id = 105872后,第二页写成:SELECT * FROM orders WHERE status = 'paid' AND id > 105872 ORDER BY id LIMIT 20
  • 如果按时间排序且created_at可能重复,必须追加主键兜底:ORDER BY created_at DESC, id DESC,WHERE条件也要对应写成复合判断

优势:每次都是索引范围扫描,执行时间恒定,与总数据量无关;缺点:无法跳转任意页码,只支持顺序翻页。

用延迟关联(Deferred Join)缓解大offset下的回表压力

当业务仍需支持“跳页”(如后台管理系统的页码输入框),又不能改成分页模式时,这是最务实的SQL层优化手段。

原理是把“查全字段”拆成两步:先用覆盖索引快速定位ID,再用这些ID批量回查。

  • 原慢查询:SELECT * FROM articles WHERE category_id = 5 ORDER BY created_at DESC LIMIT 10000, 20
  • 优化后:SELECT a.* FROM articles a INNER JOIN (SELECT id FROM articles WHERE category_id = 5 ORDER BY created_at DESC LIMIT 10000, 20) t ON a.id = t.id
  • 关键前提:category_id, created_at必须有联合索引,且子查询只查id(避免回表)

效果:子查询走覆盖索引,扫描行数大幅减少;外层JOIN避免全表扫描。实测可将LIMIT 1000000, 20从50秒降到0.2秒左右。

别忽略排序字段索引和业务约束的配合

所有优化方案都依赖一个前提:排序字段必须走索引。但光建索引不够,容易踩的坑比想象中多。

  • ORDER BY created_at却没给created_at建索引?直接退化为filesort + 全表扫描
  • WHERE条件含函数(如WHERE DATE(created_at) = '2024-01-01')?索引失效,offset再小也慢
  • 联合索引顺序错(如建了(id, created_at)却ORDER BY created_at)?无法利用索引有序性
  • 业务允许但未强制限制页码深度?用户真翻到第50万页时,再好的SQL也扛不住

真正卡住性能的,往往不是技术方案本身,而是排序字段索引缺失、类型隐式转换、或前端传入极大offset却无校验——这些细节比选哪种分页方式更早决定成败。

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

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

豆包大模型

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

WorkBuddy

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

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

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

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

4203

2023.10.12

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

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

891

2023.10.27

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

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

1089

2024.02.23

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

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

6081

2024.03.06

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

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

2963

2024.03.06

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

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

6060

2024.04.07

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

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

8161

2024.04.29

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

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

1110

2024.04.29

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

60

2026.10.10

热门下载

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

精品课程

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

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