如果另一个表中存在相同的行,则增加行的计数字段

时间:2014-09-14 19:59:50

标签: mysql sql performance

我有一个包含一列(约100万行)的表:

Table A (InnoDB)

ColA (no index, no primary key)

我还有一张桌子(300万行):

Table B (InnoDB)

ColA (PK INDEX) | count

表B是表A的超集。表B包含我需要的每一行,而表A只包含一些行。对于表A中存在的每一行,我想将表B的计数字段递增1。问题是表A非常大,因此我不能使用带有where子句的普通UPDATE命令,因为where子句将具有1百万条件。我真的在寻找性能方面最优化的方法来增加这些领域。我能想到的解决方案是:

UPDATE TABLE_B set count = count + 1 where ColA IN (SELECT ColA FROM TABLE_A)

但是这需要在两个表上进行两次完整的索引扫描,所以我不确定这是否是执行此任务的最快方法。

3 个答案:

答案 0 :(得分:2)

首先,在表A上添加一个索引:

create index idx_tablea_cola on table_a(cola)

然后将您的查询短语为:

update table_b b
    set count = count + 1
    where exists (select 1 from table_a a where a.colA = b.colA);

这假设tablea中没有重复项。或者,至少如果存在,您仍然只希望计数器增加1。

没有索引,这将是一个痛苦的操作。

答案 1 :(得分:2)

我发现了一种更快捷的方法。它似乎比其他答案快30%-35%:

INSERT
INTO   TABLE_B
SELECT colA, 1 FROM TABLE_A
ON DUPLICATE KEY
UPDATE  count = count + 1

答案 2 :(得分:1)

确保ColA在两个表中都已编入索引,这可行:

UPDATE B set count = count + 1 
WHERE (
    SELECT 1 FROM A 
    WHERE A.ColA = B.ColA LIMIT 1
) IS NOT NULL