如何解决MySQL深分页
总结起来,深分页的问题就三个:
- 扫描行数比较多
- 排序
- 回表
解决方式:
- 如果有游标或者递增ID,解决方式是记录上一页的最大/最小ID
select * from t where ... and id>minId limit 1,20
select * from t where ... and id<maxId limit 1,20
在每次返回数据的时候,都将当前页的最大id和最小id返回给前端,然后前端在请求上一页/下一页数据的时候,带上这个minId和maxId,这样使用id进行过滤,这样能有效避免大量数据排序问题。
- 使用子查询或者内连接覆盖索引拿到续传的ID后,再回表查询所有字段。
select * from t where id in (select id from t where ... limit 1000,50);
select * from t as a join (select id as t_id from t limit 1000,50) as b on a.id=b.id