Если делать в один поток:
(Сначала, работаем БЕЗ базы)
1. Берём CSV и расставляем (формируя два новых файла рядом!) через консольный скрипт/программу в нём ID-шники согласно "таблице-связке" (которая тоже в файле хранится, её изначально надо будет сделать однократно): [ID в CSV] -> [ID в нашей базе]. Это может быть как артикул, так и название (или любой другой уникальный параметр для одной уникальной записи, включая хэширование).
Получаем
CSV2-update (связанные записи) и
CSV2-new (записи, которых нет в нашей БД).
(сортировка - по желанию, но она не нужна)
(Начинаем работать с базой)
2. Обновляем сначала те, что есть: CSV2-update
3. Затем, добавляем в БД новые позиции: CSV2-new.
4. После добавления - обновляем файл "таблицы-связок".
Итог:
1. Мы все "тяжёлые" операции делаем ВНЕ базы.
2. Мы ничего не ищем по базе, а сразу берём нужную запись по ID ("ключу").
Захотите сделать сразу всё и мультипоточно на PHP: pthreads в помощь!