MySQL在3个表之间进行低效的交叉表更新

时间:2014-06-27 18:28:49

标签: mysql sql

我正在尝试将遗留数据库(没有主键)移植到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行左右。因此,三连接语句需要很长时间才能运行。我很确定我没有高效地做到这一点,那么构建查询的更有效方法是什么呢?

2 个答案:

答案 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);

答案 1 :(得分:-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;