当前位置: 代码网 > it编程>数据库>Mysql > Mysql大数据量分页优化过程

Mysql大数据量分页优化过程

2026年03月19日 Mysql 我要评论
mysql分页 (limit offset ,n)并不是跳过 offset 行,而是取 offset+n 行,然后返回放弃前 offset 行,返回 n 行,那当offset特别大的时候,效率就非常的

mysql分页 (limit offset ,n)并不是跳过 offset 行,而是取 offset+n 行,然后返回放弃前 offset 行,返回 n 行,那当offset特别大的时候,效率就非常的低下。

比如 limit 9999990,10 则mysql 一共会查询 9999990+10条数据(一千万条)然后抛弃掉前边的9999990条数据,返回最后10条

优化思路:

  • 控制返回的总页数
  • 对超过特定阈值的页数进行 sql改写。

未优化时普通sql

select count(id) from `alarm_base` 

select * from alarm_base limit 9000000,25

优化方式一、索引覆盖+子查询优化

select * from alarm_base where id >=(select id from alarm_base limit 9000000,1)

order by id limit 25

可能有小伙伴有疑问了,你子查询不也得查900_0000+1条数据吗?

确实是这样,但查的仅仅只是900_0000+1条数据的id,且id还是主键

优化方式二、起始位置重定义

# 前提 1:(默认id自增生成、升序排列)
# id> (pageindex-1)*pagesize

# 前提二 2:(记住上次查找结果的主键位置,但只能一页一页分,跳页会有问题)
# 两个前提满足其一即可使用
# sql
select * from alarm_base where id>=2300316 limit 25

优化方式三、利用延迟关联或者子查询

正例:先快速定位需要获取的 id 段,然后再关联:
 select t1.* from 表 as t1, (select id from 表 where 条件 limit 100000,20 ) as t2 where t1.id=t2.id

改写前:

改写后:

优化方式四、降级策略

​配置limit的偏移量和获取数一个最大值,超过这个最大值,就返回空数据(超过这个值你已经不是在分页了,而是在刷数据了,如果确认要找数据,应该输入合适条件来缩小范围,而不是一页一页分页。)

​这种降级逻辑在es中也有体现,当深分页数据大于10000时会报错。。。

​总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

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

发表评论

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