Mysql通过Limit和offset进行分页

Limit offset的使用

从student表中筛选出10个学生
select * from student limit 10
跳过1条数据,从第2条数据开始取,取10条数据,也就是取2,3,4三条数据
select * from student limit 1,10
从student表中筛选出10个学生,但是跳过前3个 从第四个开始算。所以分页可以通过记录offset的值进行分页
select * from student limit 10 offset 3

使用limit offset进行分页查询的弊端

对于数据库只有少量的数据是没有什么问题的,但是如果数据量超过服务器内存能够存储的能力,并且需要对所有数据进行分页,就会出现问题。
但每次接受到分页请求的时候,数据库都需要进行低效的全表扫描:

全表扫描 (又称顺序扫描)
就是在数据库中进行逐行扫描,顺序读取表中的每一行记录,然后检查各个列是否符合查询条件。这种扫描是已知最慢的,因为需要进行大量的磁盘
I/O,而且从磁盘到内存的传输开销也很大。

如果我们有十万条数据,offset的值是50000,然后limit是20:也就是说我们需要先获取10万行中的第50000行到第50020行的数据。
这样的做法效率是十分低下的。

优化思路

select * from student where id > 10 limit 20

这种是一种基于游标的分页。我们通过id>10告诉数据库从哪里开始(基于有效的索引),而不需要考虑目标范围之外的记录。

使用这个方式的前提条件:

  • 表中需要有一个唯一的序列字段,比如唯一的整数自增ID或者时间戳。
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值