推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Redis】
总结——》【Kafka】
总结——》【Spring】
总结——》【SpringBoot】
总结——》【MyBatis、MyBatis-Plus】
总结——》【Linux】
总结——》【MongoDB】
总结——》【Elasticsearch】
在系统中需要进行分页操作的时候,我们通常会使用LIMIT加上偏移量的办法实现,同时加上合适的ORDER BY子句。
需要优化的场景
在偏移量非常大的时候,需要查询并抛弃很多记录,最后却只返回很少记录
-- 查询10010条记录然后只返回最后10条,前面10 000条记录都将被抛弃,这样的代价非常高。
select * from order_exp limit 10000,10;
优化方案一
- 首先查询翻页中需要的N条数据的主键值
- 然后根据主键值回表查询所需要的N条数据
EXPLAIN SELECT * FROM (select id from order_exp limit 10000,10) b,order_exp
a where a.id = b.id;
优点:查询N条数据的主键id在索引中完成,效率高
缺点:如果数据量大,可以还会存在性能问题
优化方案二
- 前端通过点击More来获得更多数据,而不是纯粹的翻页,并且每次查询只需要使用上次查询出的数据中的id来获取接下来的数据
- 后端根据主键值id,获取数据
EXPLAIN select * from order_exp where id > 67 order by id limit 10;