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)