什么是深分页
limit 100000,10 含义:去掉前面 10 万条,取后面 10 条,就是深分页。
语法:
limit offset, rows
- offset = 要跳过多少行
- rows = 最终返回多少行
limit 100000,10:先读 100000 + 10 = 100010 条数据,前面 10 万条直接扔掉,只把最后 10 条返回给你。
为什么慢
MySQL 不是直接跳到第 10 万行。 它会先查出前 100010 条,丢掉前面 10 万条,只返回最后 10 条。 要扫描大量数据,大量回表,IO 很高,越往后越慢。
优化方案(两个常用)
- 主键 id 分页(推荐,又叫书签分页)
sql
select * from order where id > 100000 limit 10;
记住上一页最大 id,下一页直接从这个 id 往后查,不用扫描前面数据。 前提:主键连续有序。
- 先查 id,再 join 拿数据
sql
select * from order t1 inner join (select id from order limit 100000,10) t2 on t1.id=t2.id;
子查询只扫描主键索引(不走回表),拿到 id 再查完整数据,减少回表开销。
缺点 & 注意
- 主键分页不支持跳页(不能直接跳到第 5000 页),适合下拉滚动加载。
- 如果业务需要任意页码跳转,深分页很难优化,一般业务上限制最大页码,不让用户查很深的页。