好吧,也许这比我需要的要深入得多,但是我希望能够分析这个嵌套循环,以便我能够理解它。
给定:
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,因此逻辑上不应该只插入一个几行?
我想简单地说,我明白语句的 select @c:=@c+interval 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
最佳答案
在这个问题上令我满意的答案是如此简单,我不敢相信我之前没有意识到这一点。
今天,我需要快速用值填充表格,因此我决定使用另一个必须执行此操作的表格。例如,采用表 i,其列 i 的值为 1-50。我执行了以下命令来填充表 c 列 i。
插入 c 从 i,i b 中选择 i.i;
根据我上面的知识,我知道这将用 2500 个值填充表 c。因为它执行了 50^2。
我实际上发现这样做是检查表 i 中的每一行,并将其乘以第一个缓冲实例 i b
中找到的行数,然后将结果行插入表中。如果您有更多缓冲实例,它将从其中获取结果,然后继续将这些结果进一步乘以实例中找到的原始 50 行(例如 ic
)。
我最终在表 c 中得到了 50 行 1-50 的结果。
我之前没有意识到这种基于匹配的乘法是以这种方式执行的,因为我使用的是递增运算符,它会基于此乘法增量创建新行,但是它没有留下任何迹象表明这是什么之所以这样做,是因为它不匹配要复制的行,而是匹配要插入的行数。
关于mysql - 嵌套循环计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24799356/