平常开发中,咱们使用mysql来实现分页功能的时候,老是会用到mysql的limit语法.而怎么使用却颇有讲究的,今天来总结一下.mysql
limit语法支持两个参数,offset和limit,前者表示偏移量,后者表示取前limit条数据.sql
例如:性能
## 返回符合条件的前10条语句
select * from user limit 10
## 返回符合条件的第11-20条数据
select * from user limit 10,20
复制代码
从上面也能够看出来,limit n
等价于limit 0,n
.学习
实际使用中咱们会发现,在分页的后面一些页,加载会变慢,也就是说:测试
select * from user limit 1000000,10
语句执行较慢.那么咱们首先来测试一下.优化
首先是在offset较小的状况下拿100条数据.(数据总量为200左右).而后逐渐增大offset.url
select * from user limit 0,100 ---------耗时0.03s
select * from user limit 10000,100 ---------耗时0.05s
select * from user limit 100000,100 ---------耗时0.13s
select * from user limit 500000,100 ---------耗时0.23s
select * from user limit 1000000,100 ---------耗时0.50s
select * from user limit 1800000,100 ---------耗时0.98s
复制代码
能够看到随着offset的增大,性能愈来愈差.spa
这是为何呢?由于limit 10000,10
的语法其实是mysql查找到前10010条数据,以后丢弃前面的10000行,这个步骤实际上是浪费掉的.code
先找到上次分页的最大ID,而后利用id上的索引来查询,相似于select * from user where id>1000000 limit 100
.cdn
这样的效率很是快,由于主键上是有索引的,可是这样有个缺点,就是ID必须是连续的,而且查询不能有where语句,由于where语句会形成过滤数据.
mysql的查询彻底命中索引的时候,称为覆盖索引,是很是快的,由于查询只须要在索引上进行查找,以后能够直接返回,而不用再回数据表拿数据.所以咱们能够先查出索引的ID,而后根据Id拿数据.
select * from (select id from job limit 1000000,100) a left join job b on a.id = b.id;
复制代码
耗时0.2秒.
用mysql作大量数据的分页确实是有难度,可是也有一些方法能够进行优化,须要结合业务场景多进行测试.
当用户翻到10000页的时候,不如咱们直接返回空好了,这么无聊的吗...
欢迎转载,烦请署名并保留原文连接。
联系邮箱:huyanshi2580@gmail.com
更多学习笔记见我的博客------>呼延十