2014-07-17 162 views
0

好了,也許這是更深刻,比我將永遠需要但去我希望能夠分析該嵌套循環,這樣我可以理解。嵌套循環計算

考慮:

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:[email protected]+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:[email protected]+interval 1 second; 
+--------------------------+ 
| @c:[email protected]+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 

回答

0

,這是令人滿意的,我在這個問題上是如此簡單,我不能相信,我不知道答案它在此之前。

今天,我需要快速填充表值,以便我決定使用另一個表,我不得不這樣做。例如,拿我有一列值爲1-50的列表i。我執行以下命令來填充我的表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。

我沒有意識到,這種基於匹配的乘法是以前用這種方式執行的,因爲我使用的是遞增運算符,它會基於這個乘法遞增地創建新的行,但它沒有留下任何跡象表明這是它做了什麼,是因爲它沒有匹配要複製的行,而是匹配了要插入的行數。