mysql执行SQL时limit是何时生效的_mysql分页处理流程解析-mysql教程

limit 在 where、order by 之后执行,即 where→group by→having→select→order by→limit;深分页(如 limit 10000,10)性能差,推荐游标分页;窗口函数分页通常更慢,不建议仅用于分页。

MySQL 中 LIMIT 是在 WHERE、ORDER BY 之后执行的

很多人误以为 LIMIT 会“提前截断”数据来提升性能,其实它是在整个查询逻辑处理完后才生效的。具体顺序是:WHERE 过滤 → GROUP BY 分组 → HAVING 筛选 → SELECT 投影 → ORDER BY 排序 → 最后才是 LIMIT 取行。这意味着即使你只想要前 10 行,MySQL 仍可能扫描并排序全部匹配结果(尤其没走索引时)。

常见错误现象:SELECT * FROM orders WHERE status = 'paid' ORDER BY created_at DESC LIMIT 10 在 status 无索引、created_at 也未被联合覆盖时,会全表扫描 + 文件排序,再丢弃 99.9% 的行。

  • 确认是否命中索引:用 EXPLAIN 查看 key 和 Extra 字段,重点看有没有 Using filesort 或 Using temporary
  • 如果 ORDER BY 字段和 WHERE 条件字段不同,考虑创建联合索引,例如 (status, created_at)
  • LIMIT 后带偏移量(如 LIMIT 10000, 10)会导致 MySQL 跳过前 10000 行——这些行仍要被读取、排序、丢弃,性能陡降

分页场景下 LIMIT offset, size 的性能陷阱

传统 LIMIT 10000, 20 分页在大数据集上非常危险:MySQL 必须定位到第 10001 行,意味着它得按排序顺序“数”够 10000 行,哪怕只返回 20 行。offset 越大,越接近全量扫描成本。

典型表现:第 1 页很快,第 500 页响应时间飙升,慢查询日志里反复出现同一类语句。

  • 避免深分页:用游标分页(cursor-based pagination),基于上一页最后一条记录的排序字段值继续查,例如 WHERE created_at
  • 如果必须用 offset,确保 ORDER BY 字段有高选择性索引,且尽量让 WHERE 条件大幅缩小结果集
  • 注意:主键自增不等于排序稳定,若业务允许按 id 分页,WHERE id > ? ORDER BY id LIMIT 20 比 LIMIT 10000, 20 快一个数量级

MySQL 8.0+ 的窗口函数能否替代 LIMIT 分页?

不能直接替代。像 ROW_NUMBER() OVER (ORDER BY ...) 生成序号后过滤,本质仍是先算出全部序号(即全量排序),再 WHERE rn BETWEEN 10001 AND 10020,性能通常比原生 LIMIT 更差——因为多了临时表和额外计算开销。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » mysql执行SQL时limit是何时生效的_mysql分页处理流程解析-mysql教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3997590+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3997590+
  • 本周更新: 0+
  • 最后更新: 2026-03-16