在很多应用场景中我们需要将数据进行分页,一般会使用limit加上偏移量的方法实现,同时加上合适的orderby 的子句,如果这种方式有索引的帮助,效率通常不错,否则的化需要进行大量的文件排序操作,还有一种情况,当偏移量非常大的时候,前面的大部分数据都会被抛弃,这样的代价太高。
要优化这种查询的话,要么是在页面中限制分页的数量,要么优化大偏移量的性能
当limit前面的数很大时limit就会进行全表的扫描
优化limit分页
优化此类查询的最简单的办法就是尽可能地使用覆盖索引,而不是查询所有的列
除非确实需要服务器消除重复的行,否则一定要使用union all,因此没有all关键字,mysql会在查询的时候给临时表加上distinct的关键字,这个操作的代价很高
select film_id,description from film order by title limit 50,5
优化后的sql
explain select film.film_id,film.description from film inner join (select film_id from film order by title limit 50,5) as lim using(film_id);