例如我们有一个很简单的查询第3W页数据的sql
select *
from employees
limit 300000,10;
有以下优化方案,首先我们给emp_no字段设置索引
方案1:覆盖索引
select emp_no
from employees
limit 300000,10;
如果我们一定要查询所有字段呢
方案2:覆盖索引+join
select *
from employees e
inner join
(select emp_no
from employees
limit 300000,10) t
using (emp_no
);
方案3:覆盖索引+子查询
select *
from employees
where emp_no
>=
(select emp_no
from employees
limit 300000,1)
limit 10;
方案4:范围查询+limit语句 此方案得获得起始主键值
select *
from employees
where emp_no
> 10010
limit 10;
方案5:如果能获得起始主键值 & 结束主键值
select *
from employees
where emp_no
between 20000 and 20010;
方案6:业务上做一定的妥协 例如:禁止传入过大的页码等