MySQL limit分页大偏移量慢的原因分析

文章探讨了在MySQL中进行数据查询时,无索引与添加score字段索引对查询性能的影响。在浅分页情况下,使用索引能显著提升效率,而深分页时效果不明显。问题在于MySQL在深分页时可能选择全表扫描而非仅回表10次,原因是优化器认为全表扫描更快。解决方案包括利用覆盖索引和调整查询策略来优化深分页的效率。
摘要由CSDN通过智能技术生成

一、数据背景

  • 学生分数表: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的优化器认为,不走索引比走索引更快。而因为全表扫描,导致每一条数据都要先回表,查到满足条件的数据之后要丢弃前面的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值