mysql深分页问题

发布时间 2023-09-21 00:06:45作者: 野风*

什么是深分页?

在讲深分页之前看一道我在面试阿里巴巴遇到的一道面试题。

问: 现有一张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}

相当于每次都访问第一页,也不存在深分页的问题了,推荐使用。

使用场景

不适合跳页场景,只适合上一页,下一页场景。