分页查询在数据量大、页码越深时性能容易急剧下降,核心思路是避免 OFFSET 深度扫描 + 减少不必要的数据处理。下面按常见场景给你一套优化方案。
SELECT * FROM orders
ORDER BY id
LIMIT 1000000, 20;
问题:
最适合无限滚动、下一页场景
SELECT * FROM orders
WHERE id > 1000000
ORDER BY id
LIMIT 20;
优点:
缺点:
适合必须保留 LIMIT offset, size 的场景
SELECT a.*
FROM orders a
JOIN (
SELECT id
FROM orders
ORDER BY id
LIMIT 1000000, 20
) b ON a.id = b.id;
原理:
例如:
这是成本最低、最常用的方案。
适合报表、统计分析:
分页 SQL 必须:
ORDER BY 的列有索引
WHERE + ORDER BY 能走同一个索引
❌ 错误示例:
ORDER BY create_time DESC, id DESC
-- 但索引只有 (create_time)
✅ 正确:
INDEX(create_time, id)
SELECT *WHERE id > ?FETCH NEXT 20 ROWS ONLYsearch_after 代替 from + sizefrom 超过 10000 会报错| 场景 | 推荐 |
|---|---|
| 前端翻页(下一页) | 游标分页 |
| 后台管理(跳页) | 延迟关联 + 限制页数 |
| 大数据量统计 | 预计算 / ES |
| 实时性要求高 | 索引优化 |
如果你愿意,可以告诉我:
我可以直接帮你写最优分页 SQL。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。