MySQL分页写法
select * from employees_1 limit 10000,10;
- 其执行逻辑实际上读取了10010条记录,
- 抛弃面前的10000行,
- 读取到后面需要的10行,
- 其执行效率是比较低
1 自增主键分页查询优化
limit 90000,10查询
由于其id自增且连续,并且没有其他过滤条件
因此可以改造sql优化,查看id大于90000的数据,只查询10条
可以观察到其效率提升还是很明显的
对比执行计划可知,下方SQL因为走索引查询避免了全表扫描
然后上述情况需要严格满足如下条件
- 主键自增且连续
- 查询接口按照主键排序
- 没有其他的过滤条件
在日常开发中,以上要求还是比较严格的,很难满足。
当其主键id不连续时,还可以通过入参startId进行优化
当获取第一页时直接获取limit 10
当前第二页时,第一页最大id值肯定能得到,可以执行 where id>startId limit 10获取数据
当获取第N页时依次类推。
2 非主键排序分页查询优化
根据分主键字段排序进行分页查询时
此时不能走索引,并且要使用文件排序
可以优化为先试用索引找到所需要10行数据的id,然后根据id关联查询需要的数据
其首先使用索引,找打了需要10行数据的id值,生成派生表e1
然后全表扫描e1,关联id字段驱动查询e表,查询出需要数据
从执行效果来看执行耗时有很大的提升