Задать вопрос
winbackgo
@winbackgo

Синхронизация: Удаление данных

Имеются две таблицы (T1 и T2). Таблицы находятся в разных базах и на разных серверах. Данные из T1 синхронизируются с T2. Процесс синхронизации простой, из T2 берется дата последней записи, из T1 извлекаются данные обновленные после этой даты, потом вставляются/обновляются в T2.
Как бы реализовать удаление данных, которых нет в T1? Записей много, несколько миллионов. Операцию надо производить регулярно. У таблиц есть общее поле ID.
Самый просто вариант это перебрать все записи и вычислить пропущенные ID, но вот как сделать это с минимальными накладными расходами?

UPD: Структуры таблиц разные, данные используются в двух совершенно разных проектах. Репликация тут не пойдет. Скажем сервер где T2 работает как парсер и из T1 может только читать. T1 же о T2 вообще ничего не знает.

UPD2:
Пока что только дошел вот до такого запроса:
SET @counter=0;
SELECT 
ID,
IF(@counter+1 != ID, CONCAT(@counter+1, '-', ID-1), NULL) AS missing,
@counter:=ID
FROM T1 ORDER BY ID;
Думаю как теперь извлечь не NULL данные, если бы была возможность записи то можно было бы создать временную таблицу, но права есть только на чтение. Еще минус в том что полученные missing надо парсить и делать из них диапазон.
  • Вопрос задан
  • 2695 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
gaelpa
@gaelpa
Написать триггер, записывающий ID удаленной/измененной записи таблицы T1 в таблицу T1del.
Ответ написан
@Fortop
Tech/Team lead
Почему не настроить репликацию?
Ответ написан
frasl
@frasl
Немного наивный вариант — проверять строго дельту. Т. е.

delete from t2 where record_time >= sync_time and id not in (select id from t1 where record_time >= sync_time)

если синхронизации относительно частые (дельты невелики) — будет неплохо.
Ответ написан
Комментировать
dbmaster
@dbmaster
Кроме предложенных вариантов есть ещё один — сделать завести флаг deleted в таблице T1.
Ответ написан
spacediver
@spacediver
как сделать это с минимальными накладными расходами?

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

Может быть, после 1-2 запусков сервер так или иначе «прогреется» и станет обрабатывать эти операции быстрее?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы