Как оптимально импортировать часто изменяемые записи из файла в бд?
Здравствуйте!
Есть база данных с каталогом продукции (mysql) в которую нужно часто импортировать большой объем записей из CSV файлов, из различных API. У каждого источника есть свой идентификатор (shop_id).
Как организовать импорт данных? Рассматриваю такой вариант:
- Открыть транзакцию
- Удалить все записи для импортируемого shop_id
- Добавить все записи из источника
- Закоммитить транзакцию
На каждый источник порядка 50к записей, импортировать каждый источник нужно каждый час.
Что можете посоветовать? Спасибо.
А вам обязательно гарантировать целостность данных? Понятное дело что это хорошо, держать все под контролем, но занимает определенное время и блокирует операции. Плюс, что с целостностью идентификаторов?
Snewer, если вам охота поставить это на поток и не беспокоиться о нагрузке, то можете создавать "задания". То есть создаёте базу с импорта и (файл и метаинформация). После этого отправляете его на валидацию (в message broker). Если он валиден то создаёте набор заданий на импорт и спокойно из другой очереди из обрабатываете. Не забудьте про исключения и тому подобные вещи. Так же стоит добавить параллельный обработчик, который удаляет(прячет) товары, которые не находятся в выгрузке
Snewer, да. И обрабатываться они будут независимом можете повесить с другой стороны хоть один воркер, хоть тысячу. Получите масштабируемость и в случае увеличения нагрузки максимум - задержки, но не результат. Кончено стоит добавить каунтер к импорту чтобы знать что он завершился
Тогда обновляйте последовательно. Транзакция на truncate и добавление 50к не должна создать проблем для хорошего сервера СУБД. Таблица не перегружена индексами?
Если вышеописанные советы (заливаете данные во временную таблицу а потом delete + insert + commit) будут сильно нагружать базу, попробуйте вместо удаления делать update (имеет смысл если ваш скрипт единственный, кто правит данные, тогда не придется блокировать таблицу), однозначно это будет на порядок быстрее, так как почти наверняка в старых данных и в новых изменения минимальны (цены и небольшое количество новых и удаленных товаров).