mysql5.7子查询order by失效问题

网友说的是这样的:

问题:mysql5.7子查询order by失效 
原因:在mysql5.7中,如果不加limit,系统会把order by优化掉。

在mysql5.7手册的8.2.2.1中有解释:

子查询的优化是使用半连接的策略完成的(The optimizer uses semi-join strategies to improve subquery execution)

使用半连接进行优化,子查询语句必须满足一些标准(In MySQL, a subquery must satisfy these criteria to be handledas a semi-join)。

其中一个标准是:必须不是一个包含了limit和order by的语句(It must not have ORDER BY with LIMIT.)

从上面的话中我得出了一个结论, 接下来我们测试一下。

比如:

select * from 

tbk_xxx WHERE type_name = '女装' ORDER BY `visitor_volume`  desc ,coupon_price desc limit 1000;

ORDER BY `visitor_volume`  desc是固定的,只会更改第二个掉件,就是后面的coupon_price desc,但是在阿里云mysql5.7中我试过了,没有任何作用,后面的条件不管怎么改,结果都是跟ORDER BY `visitor_volume`  desc这一个条件出来的值一模一样。

最终换了一个写法:

SELECT a.* FROM  ( select
*
from tbk_xxx b ORDER BY b.visitor_volume desc LIMIT 1,20) a ORDER BY a.coupon_price DESC

换成这样就OK 了


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值