Актуализация данных в mysql-таблице. Много данных.
Всем привет!
Ситуация такая.
Есть в базе таблица, скажем, с десятью тысячами строк. Их будет и 100 тысяч, и миллион, и гораздо больше.
И есть внешний источник этих данных, т.е. api стороннего сайта, откуда эти данные по крону вытягиваются.
Количество данных увеличивается постоянно. И с каждым разом с внешнего сайта нужно вытягивать всё больше и больше.
Задача — держать данные в таблице в актуальном состоянии, в соответствии с этим внешним источником.
Вопрос — как такое лучше провернуть?)
Какие я вижу варианты:
1.1. Делать pdo-выборку всех строк таблицы
1.2. Делать выборку всех данных с внешнего сайта.
1.3. Затем array_diff, array_merge, чистим таблицу и забиваем её по новой получившимися результатами.
Но мержить 2 массива, в каждом из которых сотни тысяч (а то и миллионы), сами понимаете, — бред полный. Да и текст SQL-запроса будет весить под сотни килобайт, если не мегабайт.
Вариант 2.
Стандартный для импортёра алгоритм:
2.1. Циклично вытаскивать, скажем, по тысяче строк из внешнего api.
2.2. Делать выборку из базы для всех id, которые есть в новых данных. Сделать array_diff, обновить в базе изменившиеся.
2.3. Строки с id-шниками, которых в базе нет — добавляем.
2.4.
2.5. Грузим из вне следующую тысячу строк. И так далее, пока всё не обработаем.
И с каждым новым месяцем и годом, этот скрипт будет работать всё медленней и медленней, всё медленней и медленней…
Больше у меня вариантов нет.
Может быть есть что-то другое?
Может быть какие-то встроенные средства mysql'я для diff'а данных.
Может для обработки из php есть алгоритм быстрее и надёжнее?
Очень не хочется заранее закладывать бомбу замедленного действия.
Ситуация такая.
Есть в базе таблица, скажем, с десятью тысячами строк. Их будет и 100 тысяч, и миллион, и гораздо больше.
И есть внешний источник этих данных, т.е. api стороннего сайта, откуда эти данные по крону вытягиваются.
Количество данных увеличивается постоянно. И с каждым разом с внешнего сайта нужно вытягивать всё больше и больше.
Задача — держать данные в таблице в актуальном состоянии, в соответствии с этим внешним источником.
Вопрос — как такое лучше провернуть?)
Какие я вижу варианты:
1.1. Делать pdo-выборку всех строк таблицы
1.2. Делать выборку всех данных с внешнего сайта.
1.3. Затем array_diff, array_merge, чистим таблицу и забиваем её по новой получившимися результатами.
Но мержить 2 массива, в каждом из которых сотни тысяч (а то и миллионы), сами понимаете, — бред полный. Да и текст SQL-запроса будет весить под сотни килобайт, если не мегабайт.
Вариант 2.
Стандартный для импортёра алгоритм:
2.1. Циклично вытаскивать, скажем, по тысяче строк из внешнего api.
2.2. Делать выборку из базы для всех id, которые есть в новых данных. Сделать array_diff, обновить в базе изменившиеся.
2.3. Строки с id-шниками, которых в базе нет — добавляем.
2.4.
DELETE FROM table_name WHERE id NOT IN (123,234,456,23545,45,234,567,345.......)
где цифры в скобках — это id-шники всех только что полученных данных. 2.5. Грузим из вне следующую тысячу строк. И так далее, пока всё не обработаем.
И с каждым новым месяцем и годом, этот скрипт будет работать всё медленней и медленней, всё медленней и медленней…
Больше у меня вариантов нет.
Может быть есть что-то другое?
Может быть какие-то встроенные средства mysql'я для diff'а данных.
Может для обработки из php есть алгоритм быстрее и надёжнее?
Очень не хочется заранее закладывать бомбу замедленного действия.
Комментарии: 4
Может быть какие-то встроенные средства mysql'я для diff'а данных.Есть возможность вставки данных с заменой, при использовании первичного ключа. То есть
INSERT REPLACE ...
Работает очень быстро. Если у тебя нет доступа к чужой БД, то только так, никакой репликации не светит.Может для обработки из php есть алгоритм быстрее и надёжнее?Если использовать INSERT REPLACE то на php ничего проверять не нужно. Если есть id и он совпадает в твоей и чужой таблице — новая строка вставится в таблицу, а старая удалится — главное, настроить уникальные ключи.
Ну и есть, конечно
INSERT ... ON DUPLICATE KEY UPDATE ...
Спасибо! Ушёл читать мануалы)
А как таким методом удалить существующие в своей таблице, но отсутствующие в новых данных строки? Т.е. те, которые уже не актуальны.
Пункт 2.4.?
А как таким методом удалить существующие в своей таблице, но отсутствующие в новых данных строки? Т.е. те, которые уже не актуальны.
Пункт 2.4.?
DELETE FROM table_name WHERE id NOT IN (123,234,456,23545,45,234,567,345.......)
Только так, да. Другого способа не вижу.
Спасибо за совет!
Как всегда :-)
Как всегда :-)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.