分页查询优化
最简单的select分页是这样的:
select * from user limit 2000,10
mysql实际上会默认 order by id asc,然后再进行limit。这个有个问题是先对user表的所有数据排好序了再进行limit,其他页的数据不是自己想要的但也排序浪费时间
因此可以改写成下面:
select * from user where id > 2000 limit 10
此方式,是利用了id自增的方式,过滤了前2000条数据,然后直接取10条数据,但有很大的局限性:
- id必须是数字自增
- 业务上要求是对id(创建时间)为升序
因此可以再改下:
select *
from user u
inner join (select id from user order by id limit 2000,10) u1 on u.id = u1.id
此方式是利用上了id的索引,提升需要数据的查询速度。 弥补了上种方式的两个局限性,id不需要自增,排序字段是可以任意的,只要加索引就行。
局限性:
- 就是得自己手写分页SQL,平时分页都是借助分页工具。分页工具都是查完全部数据后再进行limit的