在mysql limit分页中使用延迟关联和覆盖索引

MySQL只需要通过索引就可以返回查询所需要的数据,而不必在查到索引之后进行回表操作,减少IO,提供效率。

t_wx_bus_member 中有500万条数据,其中id为主键

执行select * from t_wx_bus_member order by id desc limit 4000000 ,10 花费了11s左右的时间

在mysql limit分页中使用延迟关联和覆盖索引

再次执行EXPLAIN select * from t_wx_bus_member order by id desc limit 4000000 ,10

在mysql limit分页中使用延迟关联和覆盖索引

发现Extra为null,说明没有用到覆盖索引

于是优化下sql:

select * from t_wx_bus_member m 
inner join (select id from t_wx_bus_member order by id desc limit 4000000 ,10)b on m.id = b.id

在mysql limit分页中使用延迟关联和覆盖索引

发现执行时间变成2s左右了

继续分析:EXPLAIN select * from t_wx_bus_member m 
inner join (select id from t_wx_bus_member order by id desc limit 4000000 ,10)b on m.id = b.id

在mysql limit分页中使用延迟关联和覆盖索引

说明select id from t_wx_bus_member order by id desc limit 4000000 ,10使用到了覆盖索引,效率提高了

另外一种分页优化方式,先查询到偏移量的位置,再取前10条

在mysql limit分页中使用延迟关联和覆盖索引

同样分析下执行计划

在mysql limit分页中使用延迟关联和覆盖索引

记第一次写博客