分页查询优化
优化概述
分页查询优化可以从如下2个维度来做:
1.设计层面
2.SQL层面
设计层面
产品设计时,界面上不要显示总数,只显示页码,如:“上一页 1 2 3 下一页”。
将具体的页数换成“下一页”按钮,假设每页显示20条记录,那么每次查询时都是用LIMIT返回21条记录并只显示20条,如果第21条存在,那么就显示“下一页”按钮。
先获取并缓存较多的数据(例如1000条),然后每次分页都从缓存中获取。这样做可以让应用程序根据结果集的大小采取不同策略,如果结果集少于1000,就可以在页面上显示所有的分页连接;如果结果集大于1000,则可以在页面上设计一个额外的“找到的结果多于1000条”之类的按钮。
SQL层面
优化思路:
(1)尽可能使用索引覆盖扫描,而不是查询所有的列,然后根据需要做一次关联操作再返回所需的列(延迟关联)
(2)将limit查询转换为已知位置的查询,让mysql通过范围扫描获得对应的结果(范围扫描)
具体实践:
(1)不要使用简单的分页查询方式直接到数据库查询,如:SELECT * FROM order LIMIT 100000, 10
(2)如果主键ID连续递增(没有数据记录被物理删除的情况下可以保证),根据主键ID按范围查询优化:
SELECT * FROM order WHERE id > 100000 AND id <= 100010 ORDER BY id;
或者
SELECT * FROM order WHERE id > 100000 LIMIT 10 ORDER BY id;
或者
SELECT * FROM order WHERE id >= (SELECT id FROM order ORDER BY id limit 100000,1) limit 0,10;
(3)如果主键ID不连续,可以使用如下优化方式
- 子查询优化
SELECT * FROM WHERE id IN (SELECT id FROM order ORDER BY id LIMIT 100000, 10) ORDER BY id;
- 延迟关联优化
SELECT * FROM order INNER JOIN (SELECT id FROM order LIMIT 100000,10) AS lim USING(id);
作者:编程随笔
出处:http://www.cnblogs.com/nuccch/
声明:本文版权归作者和博客园共有,欢迎转载,但请在文章页面明显位置给出原文连接。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南