SELECT film_id,title, from film order by title limit 900, 10;

  • 先执行黑色部分,再执行红色分页
  • 丢弃很多无用数据,效率低下

    优化思路

  • 先想办法走索引覆盖

  • 得到所需数据的ID
  • 根据所需数据的ID,得到最终结果集

    优化SQL

    image.png
    image.png
    在不改变索引的情况下

  • 得到所需数据的主键

    1. select film_id from film order by title limit 900, 10;
  • 原表与上面的结果连表,获取最终结果

    SELECT f.film_id, f.title, f.description FROM `film` f 
    INNER JOIN ( SELECT film_id FROM `film` ORDER BY title LIMIT 900, 10 ) m 
    ON f.film_id = m.film_id;
    

    总结

  • 排序偏移量大时,会丢弃大量无用数据,导致效率低下

  • 可以采取先索引覆盖,再用最终ID回表的方法,优化效率