В зависимости от размера базы данных, двоичный поиск может стоить того.
По сути, создайте запрос, который запускает MD5()
для подмножества строк.Тогда это так же просто, как пройтись по дереву в двоичном виде, пропуская те разделы, которые соответствуют.Шаги:
Предварительно рассчитать первые 3 уровня поиска (или около того), отправить его клиенту.
На клиенте,вычислить эти 3 уровня, проверить на совпадения.На тех, которые не совпадают, вычислите 3 уровня (14 хешей на несоответствующий уровень 3) и отправьте обратно на сервер.
На сервере вычислите следующие 3 уровня и сравните с тем, чтобыл отправлен клиентом.Вычислите следующие 3 уровня для несовпадающих строк.
Повторяйте 2-3, пока число строк не достигнет 1 в каждом пределе.Оказавшись там, вы определили различия, поэтому отправьте / запросите их с сервера, и все готово.
Теперь, почему это более эффективно, чем отправка дампа?Что ж, для 1 измененной строки это займет примерно log(total_rows, 2) * (sizeofMD5 + 2)
переданных байтов (без учета служебных данных).Таким образом, для таблицы с 1 миллионом строк потребуется около 352 байтов данных в одном направлении для определения измененной строки.Теперь, чем больше строк будет изменено, тем больше данных он будет использовать.
Я выбрал пакеты по 3, поскольку это хороший компромисс между обработкой дополнительных данных и уменьшением задержки с количеством соединений.
Теперь, что касается хэширования строк, вы можете сделать что-токак:
SELECT MD5(GROUP_CONCAT(row)) AS checksum FROM
(
SELECT 1 AS grouping, MD5(CONCAT(id, col2, col3)) AS row
FROM table
ORDER BY id ASC
WHERE id > ? AND id < ?
) AS a
GROUP BY grouping
, который будет производить один MD5, который зависит от каждой строки в пределе.(есть и другие способы, но это иллюстрация).Затем просто вызовите это с помощью 0, count(rows)
, чтобы проверить всю таблицу целиком, а затем выполните итерацию вниз по цепочке.
Обратите внимание, что это будет работать только для таблиц с целым числом PK (поскольку оно используется в качестве ограничивающегоокно бинарного поиска).Но он будет обнаруживать все типы изменений (master-delete, slave-delete, master-change, slave-change, master-insert, slave-insert) с той же скоростью, эффективностью и кодом.