Даже если такой запрос будет выполнять 5 минут - это совершенно нормально для операции которая выполняется раз в день.
Улучшить ситуацию можно через хранимки или начать использовать
https://php.net/manual/ru/mysqli.multi-query.php
С другой стороны у вас совершенно "упушен" момент про индексы, и условия в первом и втором запросе различаются.
Что можно сделать чтобы было "совсем хорошо"
1. Установить тип поля артикуля в char[точный размер]. Вообще "fixed" таблицы, где размер строки всегда можно заранее посчитать работают лучше.
2. Добавить UNIQUE индекс на артикуль. Он же уникальный?
3. Идем по "новым записям" и "INSERT INTO table(...)... ON DUPLICATE KEY UPDATE price=newprice. В общем инсертим строки, но если такая есть - обновляем.
3.1 Если новых строк нет вообще - делаем только апдейты
3.2 Если есть - заводим еще одно поле - "dirty". В начале ставим в 0, в инсертах и апдейтах ставим в 1. После окончания работы строк, которые не обновлялись" будет 0.
4. Можно еще вспомнить, что любые строковые индексы работают плохо, как бы вы их не спрашивали. Можно добавить еще одно поле crc=CRC32(article), которая переведет строку в число.
4.1 Итого UNIQUE вешается на два поля - crc(первое), article
4.2 В WHERE выражениях можно делать WHERE crc=CRC32(?) and article=? - это будет работать очень сильно быстрее и без коллизий.
А вообще можно особо и не париться, например обновлять данные "в лоб" на локальном компе, а потом переливать дампы.