当前位置: 代码网 > it编程>数据库>Mysql > MySQL LIMIT 深分页性能问题与优化实战

MySQL LIMIT 深分页性能问题与优化实战

2026年02月11日 Mysql 我要评论
一、题目回顾执行语句如下:select * from orders limit 100, 100;意思是:跳过前 100 行,取接下来的 100 行。二、mysql 的执行逻辑mysql 的 limi

一、题目回顾

执行语句如下:

select * from orders limit 100, 100;

意思是:
跳过前 100 行,取接下来的 100 行。

二、mysql 的执行逻辑

mysql 的 limit offset, count 实际执行流程是这样的:

  1. 从结果集的开头开始扫描;
  2. 一直取到 offset + count 条;
  3. 扔掉前 offset 条;
  4. 返回后面的 count 条给客户端。

👉 换句话说:

mysql 必须先扫描 offset + count 行数据,
再丢弃 offset 行,只返回 count 行。

三、代入具体数字

你的 sql:

limit 100, 100

即:

  • offset = 100
  • count = 100

那么 mysql 实际上会扫描 200 行

扫描 200 行 → 丢掉前 100 行 → 返回 100 行。

四、更大的偏移量时的问题

假设语句:

select * from orders limit 1000000, 100;

mysql 依然会:

  • 扫描前 1,000,100 行
  • 丢掉前 1,000,000 行;
  • 仅返回最后的 100 行。

⚠️ 性能问题:

  • offset 越大,浪费越多;
  • mysql 没有“从第 n 条开始读取”的索引级跳转机制;
  • 所以分页越深,查询越慢。

五、为什么 mysql 要这么干?

mysql 的执行计划是基于结果集顺序的:

  • 没有 offset 索引直接跳过功能;
  • 除非你手动提供一个有序字段(如自增 id 或时间戳);
  • 否则它必须遍历前 offset 行,才能保证返回结果的排序正确。

六、如何优化深分页?

方法 1:基于主键或排序字段“范围分页”

例如原语句:

select * from orders order by id limit 1000000, 100;

可以改为:

select * from orders
where id > 1000000
order by id
limit 100;

这样 mysql 可以用索引定位到 id=1000001 的位置,然后顺序扫描 100 行,性能极快。

方法 2:记录上次分页的“游标位置”

前端分页时保存最后一条记录的 id:

-- 第一次查询
select * from orders order by id limit 100;

-- 第二页查询
select * from orders where id > {last_id_of_prev_page} order by id limit 100;

这叫 keyset pagination(基于键的分页)
可以避免深度偏移,尤其适合滚动加载、无限下拉列表等场景。

方法 3:子查询 + join 减少数据传递量(部分场景)

select o.*
from orders o
join (
  select id from orders order by id limit 1000000, 100
) t on o.id = t.id;
  • 子查询只拿 id(轻量);
  • 再 join 原表获取完整行;
  • 比直接 limit 效率更好。

七、结论总结

语句实际扫描行数返回行数特点
limit 100, 100200 行100 行小偏移量,影响可忽略
limit 1000000, 1001,000,100 行100 行⚠️ 深分页,极慢
where id > x limit 100100 行100 行✅ 推荐分页方式

八、总结

mysql 的 limit offset, count 会扫描 offset + count 行,返回 count 行。
当 offset 很大时,性能急剧下降,建议用基于主键的范围分页(keyset pagination) 代替。

到此这篇关于mysql limit 深分页性能问题与优化实战的文章就介绍到这了,更多相关mysql limit 深分页内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com