面试官提问,把第一段 SQL 改为第二段后,为什么性能会有如此之大的提高,优化逻辑是什么。
这是今天在群友在群里提出来的一个问题!
当我看到题目的第一眼,我想到的是回表操作,对于第1段SQL的话应该需要回表;而对于第2段SQL的话,也是在回表操作后,使用join获取想要的数据。
理论上对第1段SQl语句,只是回表1次;而第2段SQL语句也是需回表,并且还需要表连接,应该是第2段的SQL语句的时间更长才对。
如果是第2段SQL比第1段SQL快的话,应该是有索引的作用,
理论上也应该如此,
但是会我回答的是底层的排序问题(也确实有关,但是回答的还不够面)
总结而言:大家对这道题的优化逻辑如下(都是小小的知识点!):
- user 表上有 age 的索引
- user 表上有 age 的索引,还有 id 覆盖索引
- 第二段的子查询不用回表
- 第一段 SQL 执行了全表扫描
更有朋友质疑了第二段的性能提高:
- 没有 order by,结果乱序,易产 bug
- 第一段 SQL 重跑下,应该 0 秒就出结果
- 除非是查询缓存,第二段效率未必高
- MySQL优化器真笨,为什么不直接跳到第 100000 条,白白浪费读取那么多数据
对于正确的思路可以参考以下连接:
参考:https://zhuanlan.zhihu.com/p/352715260
总结来说:就是索引、回表、页、排序的时间消耗问题!