分页查询(尤其是“深分页”)在数据库量大时很容易变慢,核心思路是避免扫描并丢弃大量已无关的数据。下面按常见场景和优化手段系统讲一下。
SELECT * FROM order
ORDER BY id
LIMIT 1000000, 20;
记住上一页最后一条的“位置”,从那里开始查
-- 上一页最后一条 id = 1000000
SELECT * FROM order
WHERE id > 1000000
ORDER BY id
LIMIT 20;
WHERE (create_time, id) > ('2024-01-01', 100)
ORDER BY create_time, id
LIMIT 20;
如果必须用 LIMIT offset:
SELECT * FROM order
JOIN (
SELECT id FROM order
ORDER BY create_time
LIMIT 1000000, 20
) t USING(id);
✅ 比直接 SELECT * 快很多
最多查前 100 页
很多电商、搜索都是这么干的
ORDER BY + INDEXORDER BY RAND()WHERE id > :last_id
ORDER BY id
FETCH NEXT 20 ROWS ONLY;
search_afterfrom + size 深翻| 场景 | 推荐方案 |
|---|---|
| 移动端 Feed | 游标分页 |
| 管理后台 | 限制页数 |
| 报表导出 | 游标 / 分批 |
| 搜索引擎 | ES search_after |
| 必须跳页 | 覆盖索引 + 延迟关联 |
不要“跳过数据”,要“记住位置”
如果你愿意,可以告诉我:
我可以直接帮你写最优 SQL。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。