mysql变量赋值先后,mysql中变量赋值的顺序

今天看高性能mysql中的6.7.9的自定义变量。

其中以一句话让我有点懵逼,那就是:使用用户自定义变量的一个最常见的问题就是没有注意到在赋值和读取变量的时候可能是在不同的阶段。

之后有一个对这句话的解释就是:这些出乎意料的结果可以在EXPLAIN语句中找到,注意看在Extra列中的'Using where', 'Using temporara'或者'Using filesort'。

说实话,反正我是没据explain中的extra列看懂赋值和读取变量到底是个什么顺序。

我猜测的顺序是先where,再orderby,再select。

我觉得MySQL语句选取结果的过程如下:

通过where条件筛选表中的数据行

根据orderby的列进行排序

通过select选取特定的列

那么就自己测试吧!测试用的是sakila数据库(MySQL官方提供的),直接百度就可以安装和使用。

主要的应该就三个,那就是select, where, order by。

当在select和where的两个语句同时进行赋值的时候

set @rownum:=0;

select actor_Id, first_name, @rownum:=@rownum+1 as cnt

from actor

where (@rownum:=@rownum+1) < 2

返回的结果为

6eb902ee918491c988f6f3e4f4a96d11.png

我觉得肯定是先执行的where语句,因为肯定是先where语句对表进行筛选(where代表条件),再进行select语句选取结果。如若不是这样,那么where语句(条件)有何意义?

即使不是这样,那也肯定不是select先执行的,因为假如select先执行,那么这个cnt是由@rownum:=@rownum+1得到的。这个cnt应该是1而不是2的。

所以肯定是where先执行,select后执行。。。

当只对orderby语句进行赋值的时候

set @rownum:=0;

select actor_id, first_name, @rownum as rownum

from actor

where @rownum <= 1

order by first_name,least(0,@rownum:=@rownum+1);

返回的结果为

a8d3bfd573734be7ba620fcc481d34a5.png

这种情况下,我还是认为where中的赋值语句是先执行的。

因为肯定是根据where筛选出需要的表,然后经过orderby进行排序。

那么是不是这样的呢?

是这样的。。。

假如不是这样的,而是由orderby先执行,那么最后只会返回一个结果,而不是两个。

当只对select语句进行赋值的时候

set @rownum:=0;

select actor_id, first_name, @rownum:=@rownum+1 as rownum

from actor

where @rownum <= 1

order by first_name;

这个返回的是全部结果集。

17520f79225ea19543f80727ee0eda29.png

先进行where,再进行orderby,最后再进行select,由于orderby中和@rownum没关系,所以优化器,就到此结束。

由于@rownum的初始值为0,所以where中的值是True,相当于选取表中的所有数据,然后根据first_name进行排序,再经过select选取。

MySQL关联执行的策略:MySQL对任何关联都执行嵌套循环关联操作,即MySQL先在一个表中循环取出单条数据,然后再嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为止。然后根据各个表匹配的行,返回查询中需要的各个列。---摘自高性能MySQL中6.4.3的MySQL如何执行关联查询

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值