根据非主键字段排序进行分页查询
但是我们工作中碰到的更多的是 你的数据不一定连续 而且不一定按照主键排序
select * from employees order by name limit 1000, 5
发现此时name字段没有用到索引,因为此时你的查询条件是联合索引的第一个元素,查询的结果集太多 mysql * 又要回表 所以直接走的全表
对于这种场景我们怎么优化
explain seelct * from employees order by name limit 1000 5 我们之前都用不到索引 [/用的文件排序]
explain select * from employees e inner join (select id from employees order by name limit 1000,5) ed on e.id=ed.id
我们可以先查这个表 吧id 给挑选出来 这样只在这个二级索引树上就可以操作 就不用回表操作 再和我们的employees表做关联,因为此时是id关联 只要关联5条就完事了
此时order by 也是在索引树上排序 没有用到文件排序
e 这个表走的eq——ref 用的主键关联 效率很高
5个id我 全表扫描没关系啊
原来sql采用的文件排序 现在sql采用索引排序
对分页的优化 先用索引吧id 过滤出来 然后再做关联
我们再往t1表中添加1w 条数据
delimiter ;;
# 创建存储过程
create procedure insert_t1()
begin
declare i int;
set i=1;
while(i<=10000) do
insert into t1(a,b) values(i,i);
set i=i+1;
end while;
end;;
delimiter ;
call insert_t1();
------------------------------>
给t2 加入100条数据
delimiter ;;
# 创建存储过程
create procedure insert_t2()
begin
declare i int;
set i=1;
while(i<=100) do
insert into t2(a,b) values(i,i);
set i=i+1;
end while;
end;;
delimiter ;
call insert_t2();