为什么MySQL分页用limit会越来越慢

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

为什么MySQL分页用limit会越来越慢,恰卡网带你了解更多相关信息。

目录
  • 一、测试实验
  • 二、 对limit分页问题的性能优化方法
    • 2.1 利用表的覆盖索引来加速分页查询
    • 2.2 利用 id>=的形式:
    • 2.3 利用join
  • 总结:

    阿牛新入职了一家新公司,第一个任务是根据条件导出订单表中的数据到文件中,阿牛心想:这也太简单了,于是很快写好了如下语句,并且告诉测试自己的代码是免测产品。

    语句如下:

    select * from orders where name=‘lilei\' and create_time>\'2020-01-01 00:00:00\' limit start,end

    没想到上线一段时间后,生产开始预警,显示这条sql为慢SQL,执行时间50多秒,严重影响到了业务。
    阿牛赶紧请教大佬猿猿帮忙查找原因,猿猿很快就帮其解决了,并且给阿牛做了以下实验:

    一、测试实验

    mysql分页直接用limit start, count分页语句:

    select * from product limit start, count

    当起始页较小时,查询没有性能问题,我们分别看下从10, 100, 1000, 10000开始分页的执行时间(每页取20条),如下:

    select * from product limit 10, 20 0.016秒select * from product limit 100, 20 0.016秒select * from product limit 1000, 20 0.047秒select * from product limit 10000, 20 0.094秒

    我们已经看出随着起始记录的增加,时间也随着增大, 这说明分页语句limit跟起始页码是有很大关系的,
    那么我们把起始记录改为40w看下(也就是记录的一半左右)

    select * from product limit 400000, 20 3.229秒

    再看我们获取最后一页记录的时间

    select * from product limit 866613, 20 37.44秒

    像这种分页最大的页码页显然这种时间是无法忍受的。
    从中我们也能总结出两件事情:
    limit语句的查询时间与起始记录的位置成正比。
    mysql的limit语句是很方便,但是对记录很多的表并不适合直接使用。

    二、 对limit分页问题的性能优化方法

    2.1 利用表的覆盖索引来加速分页查询

    我们都知道,利用了索引查询的语句中如果只包含了那个索引列(覆盖索引),那么这种情况会查询很快。
    因为利用索引查找有优化算法,且数据就在查询索引上面,不用再去找相关的数据地址了,这样节省了很多时间。
    另外Mysql中也有相关的索引缓存,在并发高的时候利用缓存就效果更好了。
    在我们的例子中,我们知道id字段是主键,自然就包含了默认的主键索引。现在让我们看看利用覆盖索引的查询效果如何:
    这次我们之间查询最后一页的数据(利用覆盖索引,只包含id列),如下:

    select id from product limit 866613, 20

    查询时间为0.2秒,相对于查询了所有列的37.44秒,提升了大概100多倍的速度。
    那么如果我们也要查询所有列,有两种方法,

    2.2 利用 id>=的形式:

    SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20

    查询时间为0.2秒,简直是一个质的飞跃啊。

    2.3 利用join

    SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.ID = b.id

    总结:

    是不是认为我没说理由,原因就是使用select * 的情况下直接用limit 600000,10 扫描的是约60万条数据,并且是需要回表60W次,也就是说大部分性能都耗在随机访问上,到头来只用到10条数据,如果先查出来ID,再关联去查询记录,就会快很多,因为索引查找符合条件的ID很快,然后再回表10次。就可以拿到我们想要的数据。

    到此这篇关于为什么MySQL分页用limit会越来越慢的文章就介绍到这了,更多相关MySQL分页limit慢内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

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

    (0)
    nan
    上一篇 2021-07-25
    下一篇 2021-07-25

    相关推荐

    • 汤丽柏琦算几线品牌(汤丽柏琦属于什么档次)

      虽然中国的个人奢侈品市场增长了45%,但由于消费者为了应对疫情对经济的影响而减少了在奢侈品方面的消费,2020年世界其他地区的个人奢侈品市场萎缩了21%。奢侈品行业在接受数字消费方面的速度非常缓慢,但是奢侈品品牌在过去的这段时间最终依靠数字渠道创收。

      2021-12-31
      0
    • 今年为啥没有冬月二十七冬月27为什么显示29

      今年为啥没有冬月二十七今年是有冬月二十七的,也就是阳历2021年12月30日(星期四),之所以有的日历上没显示冬月二十七是因为12月30日这天正好是冬天数九二九的第一天,因此在日历上显示的是冬二九,就好比2021年三伏天初伏那天日历上显示的是初伏,中

      2022-01-14
      0
    • 基金中的定开是什么意思(投资者要看过来)

      近些年,基金理财产品在投资市场热度非常高,也备受众多投资者关注。但有细心的投资者就发现,基金理财中会有

      2021-08-25
      0
    • 小米平板5怎么改图标大小

      小米平板5拥有良好的评估显示效果,并且屏占比也是具有很大的优势,可就是其中的图标过于太小,所以造成了图标间隙过大,很多用户都不太适应,所以很多用户想要知道小米平板5怎么改图标大小?那么下面就让小编给大家介绍一下小米平板5图标大小设置方法。

      2021-08-31
      0
    • C++实现LeetCode(173.二叉搜索树迭代器)

      这篇文章主要介绍了C++实现LeetCode(173.二叉搜索树迭代器),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

      2021-08-02
      0
    • iQOO官号发表低俗言论致歉(涉事的员工已经被开除)

      iQOO,是VIVO孵化的全新子品牌,独立于VIVO运营。近日,iQOO官号发表低俗言论,招致批判声一片。随后,iQOO就此发声明致歉,并表示涉事员工已经被开除。下面

      2021-08-31
      0

    发表回复

    登录后才能评论