可能颠覆我们认知的【ORDER BY】小知识点

Updated on with 0 views and 1 comments

案例

  在日常开发过程中,大家应该对【ORDER BY】非常熟悉了,相信今天分享的内容应该会让你重新认识【ORDER BY】,请先看下面的SQL和查询结果:
企业微信截图16189837872500.png
  这个SQL很简单,包含了一个子查询,子查询里面对id字段做降序,然后外层对supplier_id进行过滤,最终过滤的结果也是按照id降序的。

  现在我们在SQL最后加上【GROUP BY】,如下图:
企业微信截图16189837872501.png
  可以看到返回的是id=15,并没有返回期望的id=110。

  在解释这个问题前,我们先说明一下当前【SQL_MODE】不包含【ONLY_FULL_GROUP_BY】,否则这样的SQL会报错的。

对比

  我们先对第1条SQL做【EXPLAIN】,然后【SHOW WARNINGS】看看实际执行的SQL,如下图:
企业微信截图16189837872502.png

  然后我们对加了【GROUP BY】的SQL执行相同的操作,如下图:
企业微信截图16189837872503.png
  前后对比会发现,加了【GROUP BY】的SQL在真正执行的时候忽略了【ORDER BY】。

追根溯源

  为什么会这样呢?其实是MySQL对驱动表优化造成的。

  注意,以下3种情况全部满足时,驱动表里的【ORDER BY】才不会被忽略:
企业微信截图16189837872507.png

解决方案

  既然我们已经知道原因了,那么该怎么解决这个问题呢?相信聪明的同学应该能够想到下面这种解决方案:
企业微信截图16189837872505.png
  需要指出的是,上面的SQL在使用【GROUP BY】时其实是比较规范的,不依赖什么【ONLY_FULL_GROUP_BY】。

  为了让大家有兴趣看MySQL官方文档,这里我卖个关子抛出另一种解决方案:
企业微信截图16189837872506.png
  大家可以好好看看这篇MySQL文档 derived-table-optimization,答案就在里面!


标题:可能颠覆我们认知的【ORDER BY】小知识点
作者:yanghao
地址:http://solo.fancydigital.com.cn/articles/2021/04/26/1619424075459.html