16、使用limit offset 分页时,为什么越往后翻越慢?如何解决?

在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器哦。

当一个表数据有几百万的数据的时候成了问题!

如 * from table limit 0,10 这个没有问题 当 limit 200000,10 的时候数据读取就很慢,可以按照一下方法解决第一页会很快

PERCONA PERFORMANCE CONFERENCE 2009上,来自雅虎的几位工程师带来了一篇”EfficientPagination Using MySQL”的报告

limit10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里。

LIMIT 451350 , 30 扫描了45万多行,怪不得慢的都堵死了。

但是,limit 30 这样的语句仅仅扫描30行。

那么如果我们之前记录了最大ID,就可以在这里做文章

举个例子

日常分页SQL语句

select id,name,content from users order by id asc limit 100000,20

扫描100020行

如果记录了上次的最大ID

 select id,name,content from users where id>10073 order by id asc limit 20

扫描20行。

总数据有500万左右

以下例子 当 select * from wl_tagindex where byname='f' order by id limit 300000,10 执行时间是 3.21s

优化后:

select * from (
   select id from wl_tagindex
   where byname='f' order by id limit 300000,10
) a
left join wl_tagindex b on a.id=b.id

执行时间为 0.11s 速度明显提升
这里需要说明的是 我这里用到的字段是 byname ,id 需要把这两个字段做复合索引,否则的话效果提升不明显

总结

当一个数据库表过于庞大,LIMIT offset, length中的offset值过大,则SQL查询语句会非常缓慢,你需增加order by,并且order by字段需要建立索引。

如果使用子查询去优化LIMIT的话,则子查询必须是连续的,某种意义来讲,子查询不应该有where条件,where会过滤数据,使数据失去连续性。

如果你查询的记录比较大,并且数据传输量比较大,比如包含了text类型的field,则可以通过建立子查询。

SELECT id,title,content FROM items WHERE id IN (SELECT id FROM items ORDER BY id limit 900000, 10);

如果limit语句的offset较大,你可以通过传递pk键值来减小offset = 0,这个主键最好是int类型并且auto_increment

SELECT * FROM users WHERE uid > 456891 ORDER BY uid LIMIT 0, 10;

这条语句,大意如下:

SELECT * FROM users WHERE uid >=  (SELECT uid FROM users ORDER BY uid limit 895682, 1) limit 0, 10;

如果limit的offset值过大,用户也会翻页疲劳,你可以设置一个offset最大的,超过了可以另行处理,一般连续翻页过大,用户体验很差,则应该提供更优的用户体验给用户。

关于limit 分页优化方法请参考下面的链接:

MYSQL分页limit速度太慢的优化方法

 

转载于:https://www.cnblogs.com/zhuifeng-mayi/p/9291446.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL分页越往后的原因是因为MySQL在执行分页操作需要扫描整个数据集,并跳过前面的记录,直到找到需要返回的记录。因此,当页码越大,需要跳过的记录数就越多,查询的间就会越长。为了解决这个问题,可以使用索引或者优化查询语句来减少扫描的记录数,从而提高查询速度。还可以使用缓存技术来减少数据库的访问次数,进一步提高性能。 ### 回答2: MySQL分页越往后的原因有以下几点: 1. 数据量增加:随着分页越往后需要查询的总数据量也随之增加。如果查询的表中包含大量数据,即使使用索引加速查询,仍然需要读取更多的数据,导致查询速度变慢。 2. 执行排序:分页查询往往需要根据某一列进行排序,这个排序操作会消耗较多的资源和间。随着分页越往后需要排序的数据会变得越来越多,导致排序间逐渐增加。 3. 索引失效:当分页查询的条件不符合索引的使用规则,索引将会失效,导致查询变慢分页查询的条件通常包括limitoffset,如果这些条件导致索引失效,MySQL将会扫描更多的数据页,降低查询效率。 4. 内存使用:MySQL的分页查询需要将查询结果保存在内存中并返回给客户端,随着分页越往后需要保存的数据量也逐渐增加,可能导致内存不足,从而降低查询效率。 针对这些问题,可以采取以下措施来提高分页查询的性能: 1. 优化查询语句:尽可能减少查询的数据量,只查询需要的字段,避免不必要的排序操作。同,可以通过优化查询条件,让索引能够正常使用,提高查询效率。 2. 分批处理:将大的分页查询任务拆分成多个小的查询任务,分多次查询,减少每次查询的数据量,降低负载,提高查询性能。 3. 使用缓存:如果分页查询的结果集是经常被使用的,可以考虑将结果集缓存在内存中,避免重复查询,提高访问速度。 4. 使用合适的硬件:分页查询需要大量的计算和内存资源,使用高性能的硬件和配置合理的参数可以提高查询速度。 综上所述,MySQL分页越往后的原因主要包括数据量增加、执行排序、索引失效和内存使用等。通过优化查询语句、分批处理查询、使用缓存和合理配置硬件等措施可以提高分页查询的性能。 ### 回答3: MySQL分页越往后是由于以下几个原因导致的。 首先,MySQL在查询大量数据,从硬盘上读取数据需要一定的间。当偏移量较小的候,需要获取的数据相对较少,读取速度较快。然而,随着偏移量的增加需要跳过的数据越多,读取的数据量也越大,导致读取速度变慢。 其次,MySQL分页查询是通过LIMIT来实现的。当查询结果较小LIMIT语句的性能并不影响查询的速度。但是,当查询结果较大LIMIT语句会对查询进行额外的处理,通过跳过偏移量来获取指定页面的数据。随着偏移量的增加LIMIT语句的处理间也会增加,导致查询的速度降低。 此外,数据库查询还涉及到查询条件、索引等因素。当查询条件中包含多个约束条件,MySQL需要对每个约束条件进行判断,并返回符合条件的结果。随着数据量的增加,约束条件的判断间也会增加,从而导致查询速度变慢。而索引的使用也可能受到偏移量的影响,当偏移量较大,索引的效果减弱,查询速度变慢。 综上所述,MySQL分页查询越往后是由于读取大量数据的耗LIMIT处理增加、查询条件判断增加以及索引效果降低等因素共同作用的结果。为了提高分页查询的性能,可以考虑使用更有效的查询条件、优化数据库索引、合理设置偏移量等措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值