一道SQL面试题


面试官提问,把第一段 SQL 改为第二段后,为什么性能会有如此之大的提高,优化逻辑是什么。

这是今天在群友在群里提出来的一个问题!

当我看到题目的第一眼,我想到的是回表操作,对于第1段SQL的话应该需要回表;而对于第2段SQL的话,也是在回表操作后,使用join获取想要的数据。

理论上对第1段SQl语句,只是回表1次;而第2段SQL语句也是需回表,并且还需要表连接,应该是第2段的SQL语句的时间更长才对。

如果是第2段SQL比第1段SQL快的话,应该是有索引的作用,

理论上也应该如此,

但是会我回答的是底层的排序问题(也确实有关,但是回答的还不够面)

总结而言:大家对这道题的优化逻辑如下(都是小小的知识点!)

  1. user 表上有 age 的索引
  2. user 表上有 age 的索引,还有 id 覆盖索引
  3. 第二段的子查询不用回表
  4. 第一段 SQL 执行了全表扫描

更有朋友质疑了第二段的性能提高:

  1. 没有 order by,结果乱序,易产 bug
  2. 第一段 SQL 重跑下,应该 0 秒就出结果
  3. 除非是查询缓存,第二段效率未必高
  4. MySQL优化器真笨,为什么不直接跳到第 100000 条,白白浪费读取那么多数据

对于正确的思路可以参考以下连接:
参考:https://zhuanlan.zhihu.com/p/352715260

总结来说:就是索引、回表、页、排序的时间消耗问题!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值