如何通过延迟关联优化大数据量分页查询速度慢的问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1159个文字,预计阅读时间需要5分钟。
由于MySQL在执行这类查询时,必须先扫描并跳过前10000+行(只想获取后面的20+行),再取结果。如果id上有索引,排序快,但跳过动作仍需逐行计数;如果没有索引或涉及回表,则更慢。数据量越大、偏移量越大,在性能断崖式下降的情况下,查询速度会显著降低。
常见错误现象:EXPLAIN 显示 rows 高达几十万甚至百万,Extra 里出现 Using filesort 或 Using temporary;实际执行耗时从毫秒级升到秒级甚至十几秒。
- 不是数据量大才慢,是
OFFSET大才慢 —— 即使总数据 100 万行,LIMIT 999990, 10也会极慢 - 加
WHERE id > ?手动模拟分页,只在主键/有序字段上可行,且要求严格单调、无删除空洞 - 用
ORDER BY create_time分页时,时间可能重复,导致漏数据或重复翻页
延迟关联(Deferred Join)怎么写:用子查询先捞 ID,再关联原表
核心思路是把“找第 N 页的 ID”和“查这些 ID 对应的完整字段”拆成两步。第一步只走索引,极快;第二步用主键等值 JOIN,也快。
本文共计1159个文字,预计阅读时间需要5分钟。
由于MySQL在执行这类查询时,必须先扫描并跳过前10000+行(只想获取后面的20+行),再取结果。如果id上有索引,排序快,但跳过动作仍需逐行计数;如果没有索引或涉及回表,则更慢。数据量越大、偏移量越大,在性能断崖式下降的情况下,查询速度会显著降低。
常见错误现象:EXPLAIN 显示 rows 高达几十万甚至百万,Extra 里出现 Using filesort 或 Using temporary;实际执行耗时从毫秒级升到秒级甚至十几秒。
- 不是数据量大才慢,是
OFFSET大才慢 —— 即使总数据 100 万行,LIMIT 999990, 10也会极慢 - 加
WHERE id > ?手动模拟分页,只在主键/有序字段上可行,且要求严格单调、无删除空洞 - 用
ORDER BY create_time分页时,时间可能重复,导致漏数据或重复翻页
延迟关联(Deferred Join)怎么写:用子查询先捞 ID,再关联原表
核心思路是把“找第 N 页的 ID”和“查这些 ID 对应的完整字段”拆成两步。第一步只走索引,极快;第二步用主键等值 JOIN,也快。

