分页在前后端配合开发中,是常用的列表内容展示方式,这里就介绍下常规分页的用法以及效率优化的方法。
一、常用方法
我们常用的分页方式是利用 page、limit 进行查询,如下
select * from `表名` order by id desc limit 0,20;
select * from `表名` order by id desc limit 60,20;
...
这种常规用法在大多数情况下,都可以胜任业务需要,但是在列表数据更新频繁或者页数较大的情况会有各种问题:
1.1 数据更新频繁
如新闻数据,每秒有数百、数十条新闻添加进库,那么用户查询完 第一页20条数据,再查询第二页数据的时候,就会出现第一页的部分数据,这就造成了重复问题。这种情况很好理解,不做过多描述
1.2 页数较大问题
当用户浏览数据,浏览至500页,甚至5000页时,mysql的查询效率将极低,如下:
查询第一页时
查询第500页时
通过expain 可以观察到,rows 值水涨船高,这就意味着,虽然查询的最终结果是20条数据,但是查询第500页的时候,其实mysql是查询出了10020条数据,然后再截取20条数据,这样效率将会大大降低。实际查询表明:第一页查询用时0.025s,而第500页用时2.070s,这不能忍...
二、解决方案
解决方法也比较简单,就是增加一个last_id查询。
每一页查询之后,可以将最后一条记录的id,传入下一页数据的查询,这样SQL语句中的limit永远都是20即可。
select id, add_time, ... from `表明` where id > 200 order by id asc limit 0,20;
select id, add_time, ... from `表明` where id > 1000 order by id asc limit 0,20;
select id, add_time, ... from `表明` where id > 3000 order by id asc limit 0,20;
select id, add_time, ... from `表明` where id > 10000 order by id asc limit 0,20;
...
这样做的另外一个好处就是,不会出现重复数据的查询问题,一举两得...
注意:last_id 肯定要是主键(PK)或者索引字段。
最近做了个小说阅读网站,喜欢看小说的朋友可以看看,欢迎指正