[英]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.