在多列匹配上使用“where”或“inner join”

时间:2015-02-09 18:31:23

标签: mysql inner-join

Description of query

我有表,Table_A和Table_B分别有0.2和2.11百万行。我需要将Table_A.Score中的字段设置为1,无论我找到A1=B1 and A2=B2 and A3=B3 and A4=B4的匹配项。

我正在使用查询 update Table_A, Table_B set score=1 where A1=B1 and A2=B2 and A3=B3 and A4=B4;

但是,根据我的理解,这个查询花了太长时间(3天)。而我也可以想象;因为对于Table_A行的每次更新(其中有20万行),MySQL必须检查Table_B的每一行中的4个组合(211万行)。

然而,我想知道是否有些事我做得不对。对于p,q,r,s的每个独特组合,缺少主键索引当然可以是一个。

我还尝试了使用内部联接的查询:

update Table_A inner join Table_B on A1=B1 and A2=B2 and A3=B3 and A4=B4 set Score =1

仍然在运行。我只想了解MySQL在这种情况下的工作情况,特别是如果whereinner join存在大表的性能问题。虽然,我认为它不应该产生重大影响。

任何指针都将不胜感激。

修改:Table_A (id int(1), A1 varchar, A2 varchar, A3 varchar, A4 varchar, score int(1))

Table_B (B1 varchar, B2 varchar, B3 varchar, B4 varchar)

Explain输出为: | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+--------------------------------+ | 1 | SIMPLE | Table A | ALL | NULL | NULL | NULL | NULL | 230309 | | 1 | SIMPLE | Table B | ALL | NULL | NULL | NULL | NULL | 2035913 | Using where; Using join buffer | +----+-------------+---------------------------+------+---------------+------+--

1 个答案:

答案 0 :(得分:2)

您的查询是正确的。您需要Table_B(B1, B2, B3, B4)上的索引。

请注意,如果您正在进行大量的更新,那么锁定和日志记录的开销可能非常大。

相应的SELECT需要多长时间:

select *
from Table_A inner join
     Table_B 
     on A1 = B1 and A2 = B2 and A3 = B3 and A4 = B4;