什么是深分页?
在讲深分页之前看一道我在面试阿里巴巴遇到的一道面试题。
问: 现有一张1000万条数据的表, 要进行分页查询, 每10条数据为一页, 请你查出来第50万页的数据。
提到分页,我们常规想到的是使用 limit offset, pageSize
的方式, 但是在这个问题中, 如果还使用这个方式,查询效率会急剧下降。 所以当数据量较大,分页页数较多的时候,还使用 limit offset, pageSize
这种方式显然不太合适。
为什么limit offset, pageSize这种方式很慢?
limit offset, pageSize
这种方式,会先查询 offset
条数据,然后从 offset
开始向后查询 pageSize
条数据。 回到问题, 当我们要查询第50万页数据,需要先查询前49万9999页数据, 对于我们要的结果第50万页来说,前49.9999万页是不重要的,所以查询效率很低。
怎么优化?
- 使用子查询
- 查询条件包含上一页的查询结果
使用子查询
先用子查询查询出符合条件的主键,再用主键id做条件查出所有字段。
select * from table where id in (
select id from (
select id from table limit #{offset}, #{pageSize}
)t
)
适用场景 :
上一页,下一页、跳页
查询条件包含上一页的查询结果(分页游标)
当我们查询第二页的时候,把第一页的查询结果放到第二页的查询条件中。
select * from table where id > #{lastId} limit #{offset}, #{pageSize}
相当于每次都访问第一页,也不存在深分页的问题了,推荐使用。
使用场景
不适合跳页场景,只适合上一页,下一页场景。