diff 2 большие таблицы базы данных - PullRequest
2 голосов
/ 30 апреля 2011

дано 2 больших таблицы (представьте сотни миллионов строк), у каждой есть строковый столбец, как вы получите diff?

Ответы [ 2 ]

7 голосов
/ 11 декабря 2011

Ознакомьтесь с набором инструментов Percona с открытым исходным кодом, в частности, утилитой pt-table-sync .

Его основная цель состоит в том, чтобы синхронизировать таблицу MySQL с ее репликой, но поскольку ее вывод - это набор команд MySQL, необходимых для согласования различий между двумя таблицами, это естественно подходит для сравнения двух таблиц.

То, что он на самом деле делает под капотом, немного сложно, и он на самом деле использует разные подходы в зависимости от того, что он может сказать о ваших таблицах (индексы и т. Д.), Но одна из основных идей заключается в том, что он делает быстрые контрольные суммы CRC32 для фрагментов индексов , и если контрольные суммы не совпадают, они более тщательно проверяют эти записи. Обратите внимание, что этот метод на намного быстрее, чем линейный обход обоих индексов и сравнение их.

Впрочем, это только часть пути. Поскольку сгенерированные команды предназначены для синхронизации реплики с ее ведущей, они просто заменяют текущее содержимое реплики для всех отличающихся записей. Другими словами, сгенерированные команды изменяют all поля в записи (а не только те, которые изменились). Поэтому, когда вы используете pt-table-sync для нахождения различий, вам нужно будет обернуть результаты во что-то, чтобы изучить различные записи, сравнивая каждое поле в записи.

Но pt-table-sync делает то, что, как вы уже знали, является сложной частью: обнаружение различий, действительно быстро. Это написано на Perl; Источник должен обеспечить хорошие хлебные крошки.

0 голосов
/ 30 апреля 2011

Я бы подумал о создании индекса для этого столбца в каждой БД, а затем об использовании программы для параллельной обработки через каждую БД с использованием порядка в этом столбце. Это будет продвигаться как в случае наличия у вас одинаковых записей, так и в одной или другой, если вы обнаружите, что они не синхронизированы (отслеживание записей из последовательности). Создание индекса может быть очень дорогостоящим с точки зрения времени и пространства (по крайней мере, на начальном этапе). Сохранение его обновленным, однако, если вы собираетесь продолжить добавление записей, это не увеличит накладные расходы. Как только у вас будет индекс, вы сможете обрабатывать разницу в линейном времени. Создание индекса - при условии, что у вас достаточно места - должно быть операцией O (nlogn).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...