Ежедневно мы получаем около 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.
Удалить все данные базы данных и повторно импортировать.К сожалению, это невозможно (нам нужно хранить историю изменений, внесенных в данные. Мы теряем эту историю, когда удаляем и вставляем весь набор данных).
Есть предложения о том, как мы можем ускорить его?