目次
- 一、测试实行
- 二、 对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慢内容请搜索草根技术分享从前的文章或继续浏览下面的相干文章盼望大家以后多多支持草根技术分享! |