我正在尝试将遗留数据库(没有主键)移植到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_id
和b.id
都是int(11)
字段,b.description
和c.description
都是varchar
字段。 b.description
。并且c.description
没有任何关键字或索引。 a.id
和c.id
都是主键。
表a
和表c
都是50,000~行的表,表b
包含2000行左右。因此,三连接语句需要很长时间才能运行。我很确定我没有高效地做到这一点,那么构建查询的更有效方法是什么呢?
答案 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;