2012-04-01 74 views
1

我有一個10M行的大表,我們稱它爲表A. 我也有另外一張具有相同結構的表,並且有2M行。我們稱它爲表B.在MySQL的大型表上運行INNER JOIN的最佳方式是什麼?

每行包含大約20個字段(包括文本和數字)。

我想用表B中的適當行的值(通過主鍵連接)更新表A中的所有行。

瑣碎的更新運行幾個小時:

UPDATE A 
INNER JOIN B 
    ON A.primary_key=B.primary_key 
SET A.field1=B.field1, 
    A.field2=B.field2....; 

你能不能指點一些更聰明的做法在內部而不是一個單一的UPDATE命令加入?

在此先感謝!

+0

innodb或myisam?如果innodb開始反式;更新;承諾; http://dev.mysql.com/doc/refman/5.0/en/commit.html – 2012-04-01 13:01:05

+0

InnoDB。 爲什麼「啓動trans; update; commit」會使UPDATE更快? – diemacht 2012-04-01 15:21:29

回答

0

聽起來好像您可能因爲結果數據集的大小而存在緩衝區問題。你可以嘗試用更小的塊來做,一次可能有100K行。你可以基於PK做到這一點。找到表A中的最大primary_key,然後除以100,000以獲得所需的迭代次數。

// PSEUDO CODE 
MAX = SELECT MAX(primary_key) FROM table A 
NUM_PER_QUERY = 100000 
NUM_ITERATIONS = CEIL(MAX/NUM_PER_QUERY) 

for (i = 0; i < NUM_ITERATIONS; i++) { 
    UPDATE .... WHERE A.primary_key BETWEEN ((i * NUM_PER_QUERY) + 1) AND ((i + 1) * NUM_PER_QUERY) 
} 
+0

這種方法的問題是它假定主鍵是均勻分佈的。但是,在我的情況下,這個假設是無法完成的。 – diemacht 2012-04-01 15:20:05

+0

密鑰分配是什麼並不重要。這意味着每個查詢最多可以處理100K行,這將需要比嘗試一次執行更新所需的內存少得多的內存。 – nnichols 2012-04-01 21:06:03

相關問題