我正在定期存档某个表,并希望避免在该存档中重复。表中没有唯一列,因此我目前正在使用以下方法:
INSERT INTO archive (colA, colB, colC)
SELECT
colA, colB, colC
FROM
dim.source src
WHERE
CONCAT(src.colA, src.colB, src.colC) NOT IN (SELECT CONCAT(colA, colB, colC) FROM archive)
这行得通,但是考虑到存档包含> 4000万行,它相当慢(超过10分钟)。还有更有效的选择吗?
谢谢!
我在stackoverflow上尝试了其他几种解决方案,但是它们对我不起作用,并导致错误消息
答案 0 :(得分:0)
在MySQL中,我建议使用on duplicate key update
:
create unique index unq_test_all on test(colA, colB, colC);
然后:
insert into test (colA, colB, colC)
select colA, colB, colC
from dim.source s
on duplicate key update colA = values(colA);
答案 1 :(得分:0)
MySQL允许元组比较,因此您不需要CONCAT:
WHERE (src.colA, src.colB, src.colC) NOT IN (SELECT colA, colB, colC FROM archive)
使用这种函数消除了利用任何索引的可能性;但我不确定元组比较的效率如何,所以可能会更好:
LEFT JOIN archive AS a ON src.A = a.colA AND src.B = a.colB AND src.C = a.colC
WHERE a.archive_id IS NULL -- archive_id can be replaced with any field from archive you know would not be null if there were a match.
,当这些方法都无法正常工作时,您可以随时尝试使用相关子查询:
WHERE NOT EXISTS (SELECT * FROM archive WHERE colA = src.A AND colB = src.B AND colC = src.C)