2014-06-27 25 views
-1

我試圖將一個遺留數據庫(沒有主鍵)移植到MySQL中一個更好,更結構化的數據庫中。3個表之間的MySQL低效跨表更新

我運行此查詢:

UPDATE table a, table b, table c 
SET a.item_id = b.id 
WHERE b.description = c.description AND a.id = c.id; 

a.item_idb.id都是int(11)領域,並b.descriptionc.description都是varchar領域。 b.description。和c.description沒有任何鍵或索引。 a.idc.id都是主鍵。

a和表c都是具有50,000行的表,並且表b包含2000行左右的行。因此,三連接語句需要很長時間才能運行。我很確定我沒有高效地完成這項工作,那麼構建查詢的更有效的方法是什麼?

+0

HOOO那很多表的,爲什麼不嘗試使用顯式連接 –

+1

顯式連接加索引的描述字段。 – Tom

+0

你想用這個查詢來完成什麼?請解釋你的邏輯。 –

回答

2

首先,你應該寫這個使用join語法:

UPDATE table a join 
     table c 
     on a.id = c.id join 
     table b 
     on b.description = c.description 
    SET a.item_id = b.id ; 

這應該不會影響性能。但是,您應該在description上放置索引。我建議:

create index on b_description_id on b(description, id); 
+0

是否有我應該明確使用連接語法的原因?逗號語法不意味着連接? – user3705002

+0

@ user3705002。 。 。逗號語法*是*「交叉連接」。在大多數情況下,這不是你真正想要的。明確一點最好。另外,你不能用這種語法來表達外連接(至少不能以一種可理解的方式)。 –

-1

您可以反轉WHERE子句,以便在VARCHAR之前測試INT,這些比較更易於比較,並且會減少描述比較的子集大小。

UPDATE table a, table c, table b 
SET a.item_id = b.id 
WHERE a.id = c.id AND b.description = c.description;