一、排序+分页:偏移量大时,效率低
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后面的字段,都会加索引







Comments | NOTHING