Обновление, вставка и удаление большого MySQL из большого файла CSV - PullRequest
0 голосов
/ 23 февраля 2019

Ежедневно мы получаем около 10 миллионов строк данных в CSV-файле.Этот файл CSV содержит данные о местонахождении и цене около 5000 продуктов.

Иногда CSV обновляется, а иногда остается прежним.Данные в CSV являются источником правды (например, данные, которые мы всегда хотим использовать в наших приложениях).

Вот фрагмент из CSV:

UUID,Location,Price
AAA,Melbourne,21.96
AAA,Sydney,32.43
BBB,Melbourne,23.43
BBB,Adelaide,32.43

Нам нужно хранить самые свежие данные внутри базы данных MySQL.

Вот пример того, как эти данные должны быть сохранены:

Location_Data:

ID,ProductID,Location,Price
1,1,Melbourne,21.96
2,1,Sydney,32.43
3,2,Melbourne,23.43
4,2,Adelaide,32.43

Продукт:

ID,UUID (and other fields not relevant to this question)
1,AAA
2,BBB

Для начальногоимпорт мы используем MySQL LOAD DATA IN FILE.Это довольно быстро.Вот процесс:

  • Мы выбираем все продукты из базы данных
  • Мы сопоставляем каждую строку CSV с продуктом в базе данных
  • Затем мысоздать новый файл CSV, который мы можем напрямую импортировать в таблицу location_data.

Обновленный файл CSV может содержать новые местоположения, обновленные цены или местоположения, которые больше не существуют.Нам нужно UPDATE, INSERT и DELETE во всех этих сценариях.

Переходя к проблеме ... Мы пытаемся решить, как мы можем быстро обновить базу данных, когда мы получим новый файл CSV, который был изменен.

К сожалению, у нас есть только два варианта, которые у нас не работают:

  • Извлечение данных из базы данных и проверка их по файлу CSV (строкапо линии).Это очень медленно для получения такого количества данных, а затем очень медленно сравнивать их с CSV.

  • Удалить все данные базы данных и повторно импортировать.К сожалению, это невозможно (нам нужно хранить историю изменений, внесенных в данные. Мы теряем эту историю, когда удаляем и вставляем весь набор данных).

Есть предложения о том, как мы можем ускорить его?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...