在多列匹配上使用 "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 在这种情况下的工作情况,尤其是当 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 |
+----+-------------+---------------------------+------+---------------+------+--
您的查询是正确的。您想要 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;
我有表,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 在这种情况下的工作情况,尤其是当 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 |
+----+-------------+---------------------------+------+---------------+------+--
您的查询是正确的。您想要 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;