Актуализация данных в 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.
DELETE FROM table_name WHERE id NOT IN (123,234,456,23545,45,234,567,345.......)
где цифры в скобках — это id-шники всех только что полученных данных.
2.5. Грузим из вне следующую тысячу строк. И так далее, пока всё не обработаем.
И с каждым новым месяцем и годом, этот скрипт будет работать всё медленней и медленней, всё медленней и медленней…

Больше у меня вариантов нет.

Может быть есть что-то другое?
Может быть какие-то встроенные средства mysql'я для diff'а данных.
Может для обработки из php есть алгоритм быстрее и надёжнее?

Очень не хочется заранее закладывать бомбу замедленного действия.
Алексей Карташов
11 августа 2014, 14:21
modx.pro
1
2 234
0

Комментарии: 4

Василий Наумкин
11 августа 2014, 18:37
0
Может быть какие-то встроенные средства mysql'я для diff'а данных.
Есть возможность вставки данных с заменой, при использовании первичного ключа. То есть
INSERT REPLACE ...
Работает очень быстро. Если у тебя нет доступа к чужой БД, то только так, никакой репликации не светит.

Может для обработки из php есть алгоритм быстрее и надёжнее?
Если использовать INSERT REPLACE то на php ничего проверять не нужно. Если есть id и он совпадает в твоей и чужой таблице — новая строка вставится в таблицу, а старая удалится — главное, настроить уникальные ключи.

Ну и есть, конечно
INSERT ... ON DUPLICATE KEY UPDATE ...
    Алексей Карташов
    11 августа 2014, 18:41
    0
    Спасибо! Ушёл читать мануалы)
    А как таким методом удалить существующие в своей таблице, но отсутствующие в новых данных строки? Т.е. те, которые уже не актуальны.

    Пункт 2.4.?
    DELETE FROM table_name WHERE id NOT IN (123,234,456,23545,45,234,567,345.......)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
4