外观
一句话答案
深分页 LIMIT offset 越大越慢,优化方案:游标分页(WHERE id > last_id)、子查询定位起始 id、延迟关联。
核心要点
问题: LIMIT offset, size offset 越大越慢(扫描 offset+size 行只取 size 行)
优化方案:
- 游标分页:
WHERE id > last_id LIMIT 10(推荐) - 子查询定位:先通过覆盖索引子查询找到起始id
- 延迟关联:
JOIN (SELECT id FROM t LIMIT 1000000,10) tmp ON t.id=tmp.id
追问与易错
追问方向:
- 为什么 LIMIT offset 大时慢?
- 游标分页有什么限制?
- ES 深分页怎么处理?
易错点:
- ❌ 加索引就能解决深分页——不能解决 offset 扫描
- ❌ 前端不限制最大页数
💡 记忆锚点
深分页就像翻一本万页的书找第 99999 页的内容——你得从第 1 页开始数页码数到 99999 才能开始看,前面数的全浪费了。游标分页是记住上次看到哪一页直接翻过去(WHERE id > last_id),延迟关联是先在目录里定位页码再翻正文(子查询走覆盖索引找 id 再 JOIN 回表)。