Mysql 分页实现与性能优化

分页在前后端配合开发中,是常用的列表内容展示方式,这里就介绍下常规分页的用法以及效率优化的方法。

一、常用方法

我们常用的分页方式是利用 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)或者索引字段。

最近做了个小说阅读网站,喜欢看小说的朋友可以看看,欢迎指正

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值