5.9 分页查询这么慢,怎么办?



一、排序+分页:偏移量大时,效率低

1.1 问题

即从第900个开始,输出10个。请问:我怎么知道哪个是第900个呢?

排序。只要一排序,效率很有可能出问题。

  • 因为先执行了黑色部分,即全排序
  • 分页,看似只是取了10条数据。其实是全表排序,又把前900个无用的都丢弃了。

1.2 优化1:将title字段的单独索引,改成与descripton的联合索引

方法1:索引覆盖

title字段的单独索引,改成与descripton的联合索引:效果提升非常好

1.3 优化2:如果字段、索引不能动时,先索引覆盖,再ID回表

方法2:

如果DBA,公司运维,因为其他种种原因,要求上述字段不能动,索引也不能动。怎么办?

因为title索引,本身这个B+树,或者说这个索引表,本身就是以title进行排好序的。

所以,直接取900-910个数据,很轻松。

拿到其主键ID,回表查询。

  • 得到所需数据的主键
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;

1.3 小结

上面从第900个起,挑10条。

更有甚者,从第9万个起,就挑2条数据。

一般,order by后面的字段,都会加索引

声明:Jerry's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 5.9 分页查询这么慢,怎么办?


Stop chasing money, and start chasing the solutions to the problem.