一、数据背景
- 学生分数表:t_student_score
- 模拟了100w数据,其中score是1-1000随机数
二、场景
需求:按score字段排序,查询user_no,class,score列的数据
1.没有任何索引
这一定是正常的,因为MySQL进行了全表扫描。所以后者要比前者慢。
2.score字段加索引
把score字段加普通索引
再次查询
浅分页的效率有了很大提升,而深分页变化却不大。
三、解决方案
到这里,对于后者,你可能会轻易的想到解决办法,比如:覆盖索引、使用id关联查询,be like:
覆盖索引:
使用id关联查询(其实也是用到了覆盖索引):
网上给出这种场景的原因分析是:
- limit a, b会查询前a+b条数据,然后丢弃前a条数据
- 查询所有列导致回表
四、问题分析
为什么MySQL不只回表10次?
按理说score有索引,拿我文中例子来讲,前50w条数据MySQL明明可以不用回表,在score这棵树上查到id之后,再回表10次就可以了,为什么前面的也要回表?
分析:
浅分页,使用了索引
深分页,却是全表扫描
到这里
我认为深分页的主要原因,你查的页足够深,MySQL的优化器认为,不走索引比走索引更快。而因为全表扫描,导致每一条数据都要先回表,查到满足条件的数据之后要丢弃前面的数据。