优化分页查询速度是数据库性能调优中非常常见的问题。下面从问题根源、常见优化方案、实战示例三个层面系统说明。
最常见的分页写法:
SELECT * FROM orders
ORDER BY id
LIMIT 1000000, 20;
问题本质:
OFFSET 越大,扫描成本越高核心思想:
不用 OFFSET,用「上一页最后一条记录的值」作为起点
-- 第一页
SELECT * FROM orders
ORDER BY id
LIMIT 20;
-- 下一页(假设上一页最后 id = 100020)
SELECT * FROM orders
WHERE id > 100020
ORDER BY id
LIMIT 20;
✅ 优点:
❌ 缺点:
适用于必须 OFFSET 的场景:
SELECT a.*
FROM orders a
JOIN (
SELECT id
FROM orders
ORDER BY id
LIMIT 1000000, 20
) b ON a.id = b.id;
✅ 原理:
id)✅ 优点:
SELECT * 快很多分页查询一定要:
ORDER BY 字段有索引ORDER BY create_time DESC
-- 需要
CREATE INDEX idx_orders_create_time ON orders(create_time);
⚠️ 注意:
ORDER BY + LIMIT 无索引 = 全表排序适合:
做法:
例如:
简单但非常有效 ✅
ORDER BY + LIMIT 无索引WHERE id > ? 游标分页OFFSET 同样慢WHERE ROWNUM > ?
| 场景 | 推荐方案 |
|---|---|
| 上一页 / 下一页 | 游标分页 ✅ |
| 必须跳页 | 延迟关联 |
| 超大数据量 | 预计算 |
| 管理后台 | 限制页数 |
如果你愿意,可以告诉我:
我可以给你针对性的 SQL 优化方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。