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或者时间戳。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐