文章目录
前言
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