我有表,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在这种情况下的工作情况,特别是如果where
和inner 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 |
+----+-------------+---------------------------+------+---------------+------+--
答案 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;