我有一个包含一列(约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)
但是这需要在两个表上进行两次完整的索引扫描,所以我不确定这是否是执行此任务的最快方法。
答案 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