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

Use "where" or "inner join" on multiple column matching

我有表,Table_A 和 Table_B 分别有 0.2 和 211 万行。我需要将 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 的每一行(211 万行)中的 4 种组合。

但是,我想知道是不是我做的不对。缺少主键索引当然可以是一个,对于每个唯一的组合 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 | +----+-------------+---------------------------+------+---------------+------+--

您的查询是正确的。您想要 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;