分页查询优化
面试官问:"分页查询怎么优化?"
小陈说:"加索引。"
面试官追问:"SELECT * FROM orders ORDER BY id LIMIT 1000000, 10,怎么优化?"
小陈说:"...加索引?"
面试官继续追问:"加什么索引?优化后还需要扫描 100 万行吗?"
小张开始支支吾吾。
深度分页是 MySQL 中最常见的性能问题之一。LIMIT 1000000, 10 看起来只返回 10 条数据,但 MySQL 实际上扫描了 1000010 行。SELECT * 的危害在分页场景下被无限放大。
一、深度分页的问题 🔴
1.1 分页查询的执行过程
执行过程:
1.2 性能影响
深度分页的性能随页码线性下降。
1.3 ❌ 错误示范
候选人原话:"分页查询加个索引就行了。"
问题诊断:只说对了一半。索引可以加速排序,但如果仍然用 SELECT * 且 OFFSET 很大,仍然需要扫描大量行。
候选人原话 2:"用 OFFSET 查询第 N 页,N 越小越快。"
问题诊断:这是正确的,但不是优化方案。优化目标是避免 OFFSET 带来的全量扫描。
【面试官心理】 这道题我会问具体的 SQL 执行计划。如果候选人能说出"EXPLAIN 中 rows=1000010,说明扫描了 100 万行",说明他真正理解了这个问题的本质。
二、游标分页(推荐方案)🔴
2.1 游标分页原理
核心思想:不扫描已读过的数据,用上一页最后一条的 id 作为起点。
2.2 游标分页的适用条件
2.3 多字段游标
三、覆盖索引优化 🟡
3.1 覆盖索引减少回表
3.2 先查 ID 再关联
注意:两步查询需要字段值稳定。如果中间有数据被删除,可能查不全。
四、生产避坑 🟡
4.1 禁止深度分页的 API
4.2 统计查询的限制
4.3 百万级分页的极端优化
【面试官心理】 分页优化是 MySQL 实战中的高频考点。能说清楚"为什么深度分页慢"和"游标分页怎么实现"的候选人,说明他有实际优化经验。