- 基本分页语法
select * from employees_inndb limit offSet, pageSize;
select * from employees_inndb limit pageSize; 省略offSet,默认从0开始
- 一般的分页实现与问题
select * from employees_inndb limit 90000,5;
通过explain可以发现执行过程中:是先读取 90005条记录,然后抛弃前 90000 条记录,然后读到后面 5 条想要的数据。因此要查询一张大表比较靠后的数据,执行效率是非常低的。
常见的分页场景优化技巧
没添加单独 order by,表示通过主键排序。因此可以利用自增主键索引
select * from employees_inndb where id > 90000 limit 5;
但是这个优化大多数场景并不使用,因为如果数据被删除了的话,id与offset会不一致。
- 根据非主键字段排序的分页查询
EXPLAIN select * from employees_inndb ORDER BY name limit 90000,5;
type列:ALL、 Extra列中出现了filesort,因此可以优化。
常见优化措施:
1、与order by优化场景一样,可以通过减少查询字段尽量使用覆盖索引
EXPLAIN select name from employees_inndb ORDER BY name limit 90000,5;
2、若必须使用 *(无法使用覆盖索引),考虑优化filesort。即:分步走让排序时返回的字段尽可能少,所以可以让排序和分页操作先查出主键,然后根据主键查到对应的记录、
EXPLAIN select * from employees_inndb e inner join (select id from employees_inndb order by name limit 90000,5) ed on e.id = ed.id;
测试发现在10w数据时速度优势发现不了,100W数据可以发现