mysql中的分配顺序是什么?

时间:2018-10-11 07:03:45

标签: mysql

mysql中的分配顺序是什么?

set @rownum := 0;
explain select actor_id, first_name, @rownum as rownum
from actor
where @rownum <= 1
order by first_name, LEAST(0, @rownum:=@rownum + 1);

1 个答案:

答案 0 :(得分:0)

对于在此查询中查看的其他任何人,吐出2行,例如给出2个行号

+----------+-------+
| sudentid | fname |
+----------+-------+
|      101 | NULL  |
|      103 | NULL  |
|      112 | NULL  |
+----------+-------+
3 rows in set (0.00 sec)

查询产生

+----------+-------+--------+
| sudentid | fname | rownum |
+----------+-------+--------+
|      101 | NULL  |      1 |
|      103 | NULL  |      2 |
+----------+-------+--------+
2 rows in set (0.00 sec)

说明计划

+------+-------------+---------+------+---------------+------+---------+------+------+----------------------------------------------+
| id   | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra                                        |
+------+-------------+---------+------+---------------+------+---------+------+------+----------------------------------------------+
|    1 | SIMPLE      | student | ALL  | NULL          | NULL | NULL    | NULL |    8 | Using where; Using temporary; Using filesort |
+------+-------------+---------+------+---------------+------+---------+------+------+----------------------------------------------+
1 row in set (0.00 sec)

解释计划与我的预期相符,即最后的订单(https://blog.jooq.org/2016/12/09/a-beginners-guide-to-the-true-order-of-sql-operations/

但是似乎发生的事情是,因为order by递增了select中使用的变量,所以存在另一个按实际事件顺序调用的where子句,该子句未反映在解释计划中(我认为这反映了LOGICAL事件的顺序)。

我不知道OP在这里要做什么(或者如果结果不正确),但这不是通常在版本8之前分配行号的方式。