博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下
阅读量:6620 次
发布时间:2019-06-25

本文共 1318 字,大约阅读时间需要 4 分钟。

hot3.png

测试实验

1.   直接用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秒

难怪搜索引擎抓取我们页面的时候经常会报超时,像这种分页最大的页码页显然这种时

间是无法忍受的。

从中我们也能总结出两件事情:

1)limit语句的查询时间与起始记录的位置成正比
2)mysql的limit语句是很方便,但是对记录很多的表并不适合直接使用。

2.   对limit分页问题的性能优化方法

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

我们都知道,利用了索引查询的语句中如果只包含了那个索引列(覆盖索引),那么这种情况会查询很快。

因为利用索引查找有优化算法,且数据就在查询索引上面,不用再去找相关的数据地址了,这样节省了很多时间。另外Mysql中也有相关的索引缓存,在并发高的时候利用缓存就效果更好了。

在我们的例子中,我们知道id字段是主键,自然就包含了默认的主键索引。现在让我们看看利用覆盖索引的查询效果如何:

这次我们之间查询最后一页的数据(利用覆盖索引,只包含id列),如下:

select id from product limit 866613, 20 0.2秒
相对于查询了所有列的37.44秒,提升了大概100多倍的速度

那么如果我们也要查询所有列,有两种方法,一种是id>=的形式,另一种就是利用join,看下实际情况:

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

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

另一种写法

SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.ID = b.id
查询时间也很短,赞!

其实两者用的都是一个原理嘛,所以效果也差不多

转载于:https://my.oschina.net/u/2331760/blog/1829023

你可能感兴趣的文章
从【BZOJ4173】谈做题技巧
查看>>
学JS的心路历程-函式(六)其余参数及预设参数
查看>>
[Ting's笔记Day1] Ruby on Rails练习- MacOS安装篇
查看>>
TJOI2015 旅游
查看>>
监听器实现案例----自定义session扫描器和统计在线用户人数及用户信息
查看>>
多继承
查看>>
.net4 DataAnnotations小试(转帖)
查看>>
怎么看性能瓶颈?
查看>>
解决淘淘商城“拦截器处理请求”的一个错误
查看>>
【javascript基础】1、基本概念
查看>>
IE setAttribute frameborder 相关
查看>>
Windows Phone 8.1 Tiles, Notifications and Action Center
查看>>
P2x与P3x的区别
查看>>
setTimeout()传带有参数的函数
查看>>
webstorm for mac
查看>>
id,is的用法,小数据池的概念及编码知识进阶
查看>>
初识 go 语言
查看>>
c3p0配置文件报错 对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾。
查看>>
save(),saveOrUpdate(),merge()的区别
查看>>
C++ Guaranteed Copy Elision
查看>>