MySQL深分页

先来看两个SQL

SELECT id,`name`,birthday,email,address FROM `user` LIMIT 1500000,2000;

img

SELECT id,`name`,birthday,email,address FROM `user` LIMIT 0,2000;

img

user表具有二百万条数据,上面两个SQL都是使用limit关键字对user表进行简单分页查询,一页2000条数据,截图可以看到第一个SQL比第二个SQL慢了百倍。

sql慢的原因

limit offset,n语句会先扫描offset+n行数据,然后丢弃前offset行,返回n行数据

也就是说

limit 1500000,2000扫描了1502000行数据,这个过程需要回表1502000次

limit 0,2000只扫描了2000条数据

所以解决深分页问题的思路就是减少回表次数

通过覆盖索引+子查询优化

SELECT id,`name`,birthday,email,address FROM `user` WHERE id>=(SELECT id FROM `user` LIMIT 1500000,1) LIMIT 0,2000;

img

记录上次的位置优化

假设上一次记录到了1500000,则SQL可以改为

SELECT id,`name`,birthday,email,address FROM `user` WHERE id>=15000000 order by id LIMIT 0,2000;

这个方法是最快的,性能也是最稳定的,

但是要求id是类似于自增的,最好是连续的

如果不是连续的则需要先根据id进行排序以确定第一个ID的值

使用between…and…

如果可以计算出边界值,也可以使用between...and...关键字,这个方法同样要求id自增且连续

SELECT id,`name`,birthday,email,address FROM `user` WHERE id BETWEEN 1500001 AND 1502000
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值