为啥有些limit那么慢?

文章目录
前言
limit原理
回表
如何避免回表
参考博客
前言
很多后台会用到分页,我们可以想到pageHelper还有sql的limit。当用户量一大之后,在搜索 后面数据的时候就会特别慢。接下来解密一下原因~

limit原理
比如说limit100,10,它会去查询110条数据,然后返回最后10条数据。当你查询 limit 10000,10,也就是说需要查询10010条数据。我们可以看到越往后需要查询的数据量越来越大的,导致时间越来越长。

图示

1.初始时候的数据

2.limit查询数据

就是扫描所有的数据,在索引找到符合的数据,然后再去查询table里头查询索引对应的数据。这个过程叫回表。

回表
当使用普通索引的时候,它会先在索引那查询所有符合条件的索引,然后再回到表中根据索引查询对应的数据出来。所以这里有两次查询表的过程,简称回表。

如何避免回表
原来sql

SELECT id from activity_user_info LIMIT 200000,20;
1
sql

SELECT a1.* from activity_user_info a1 RIGHT JOIN (
SELECT id from activity_user_info LIMIT 200000,20
) a2 on  a1.id=a2.id
1
2
3
我们来explain一下


我们可以看到用了索引,查了336778多行。

再看看优化后的sql


  怎么理解呢?一开始是内部查询,就是select id,命中主键索引,然后联表去查表对应索引的数据,返回数据。
这里应该不叫避免回表,应该是避免回表查询很多数据,而且命中主键聚集索引,所以说第一步蛮快的。

  在第一次没有优化的sql的时候,它会加载200020行数据到buffer pool中,但是优化之后的sql只会加载20行到buffer pool,mysql底层我不太熟悉,但是按照这结果我来大胆的说这个过程:没有优化的是low出200020行数据再进行筛选,第二步优化的sql是筛选完再去low数据到缓存。

参考博客
一次 SQL 查询优化原理分析
MySQL ORDER BY / LIMIT performance: late row lookups
————————————————
版权声明:本文为CSDN博主「大鸡腿同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38336658/article/details/105744229

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值