直接回答
深分页慢的原因:LIMIT 1000000, 10 要求 MySQL 先扫描并丢弃前 100 万行,再返回 10 行,扫描成本随偏移量线性增长。优化核心思路是避免大 offset——改用"记住上次位置"的游标式分页,或用覆盖索引 + 子查询/内连接先定位主键再回表取数据。
展开解析
常用方案:
-
游标分页(推荐):业务上改成"上一页/下一页",用 WHERE id > 上一页最大 id ORDER BY id LIMIT 10,直接走索引,性能与页码无关。
-
子查询定位 + 回表:
SELECT t.* FROM orders t
JOIN (SELECT id FROM orders ORDER BY id LIMIT 1000000, 10) x
ON t.id = x.id;
内层只扫覆盖索引(只含 id),成本远低于带全部字段回表。
-
业务限制:像搜索引擎一样限制最大页数(谷歌也只给前几十页),或引导用户加筛选条件缩小范围。
-
异构方案:列表页用 ES 等搜索引擎承载,DB 只做明细查询。
易错点:游标分页要求排序字段唯一且单调(一般用主键或加主键做 tiebreaker);方案 2 依然要扫 100 万个索引项,只是避免了回表,页极深时仍需方案 1 或 4。