繁体   English   中英

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

[英]increment count field of a row if the same row exists in another table

我有一张表,只有一列(约一百万行):

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很大,因此我无法将常规UPDATE命令与where子句一起使用,因为where子句将具有1万条件。 我真的在寻找在性能方面最优化的方法来增加这些字段。 我能想到的解决方案是:

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

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

首先,在表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。

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

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

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

确保在两个表中都索引ColA ,这将起作用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM