嵌套循环计算

时间:2014-07-17 09:11:27

标签: mysql nested

好的,也许这比我需要的更深入但是我希望能够分析这个嵌套循环以便我能够理解它。

鉴于:

mysql> describe t1;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| dt    | datetime | NO   | MUL | NULL    |       |
+-------+----------+------+-----+---------+-------+
1 row in set (0.00 sec)

并且:

mysql> insert t1 values(101),(102),(103),(104),(105),(106),(107),(@c:=now());
Query OK, 8 rows affected (0.03 sec)
Records: 8  Duplicates: 0  Warnings: 0

mysql> insert t1 select @c:=@c+interval 1 second from t1,t1 b,t1 c,t1 d,t1 e,t1 f;
Query OK, 262144 rows affected (1.94 sec)
Records: 262144  Duplicates: 0  Warnings: 0

到目前为止,我已经了解到(#ofrows)^(#oftables)=(添加的行数)

我的问题是为什么会这样。我无法确切地知道MySQL如何处理行和其他系统变量以创建我在这里提供的等式。我的等式显然是服务器执行的结果操作的简化版本,因为使用2行数据和6个表同样给出64的输出。

有谁知道这是如何被操纵的?我已经为此工作了2天,我无法理解它......

另外为什么插入超过6 ...也许36?排在第一位的表?它只是从表中指定一个可选择的行,并且是先前插入的now()然后向该行添加1秒并根据最终更改重置@c所以不应该仅通过逻辑插入一个几排?

我想简单地说,我理解在声明中选择@c:= @ c +间隔1秒内发生的事情,但之后我不太确定......

我想简单地说它是怎么做的:

select @c:=@c+interval 1 second;
+--------------------------+
| @c:=@c+interval 1 second |
+--------------------------+
| 2014-07-20 18:17:50      |
+--------------------------+
1 row in set (0.00 sec)

变成这个:

...
Query OK, 262144 rows affected (1.94 sec) 
Records: 262144 Duplicates: 0 Warnings: 0

1 个答案:

答案 0 :(得分:0)

在这个问题上令我满意的答案非常简单,我无法相信我之前没有意识到这一点。

今天我需要快速填充一个包含值的表,所以我决定使用另一个表,我必须这样做。例如,使用表i,其中列i的值为1-50。我执行了以下命令来填充我的表c列i。

insert into c select i.i from i,i b;

根据我的上述知识,我知道这将填充表c恰好2500个值。因为它执行了50 ^ 2。

我实际发现,这样做是检查表i中的每一行,并将其乘以第一个缓冲实例i b中找到的行数,然后将结果行插入表中。如果你有更多的缓冲实例,它将从一个获得结果,然后继续将这些结果乘以在实例中找到的原始50行(例如i c)。

我在表c中最终得到50行1-50。

我没有意识到这种基于匹配的乘法之前是以这种方式执行的,因为我使用的是递增运算符,它会根据此乘法逐步创建新行,但是它没有留下任何迹象表明这一点是因为它没有匹配要复制的行,而是匹配要插入的行数。