#mysql #database #algorithm
#mysql #База данных #алгоритм
Вопрос:
учитывая 2 большие таблицы (представьте сотни миллионов строк), в каждой из которых есть столбец string, как вы получаете разницу?
Ответ №1:
Ознакомьтесь с инструментарием Percona Toolkit с открытым исходным кодом, в частности, с утилитой pt-table-sync.
Его основная цель — синхронизировать таблицу MySQL с ее репликой, но поскольку его выходные данные представляют собой набор команд MySQL, необходимых для согласования различий между двумя таблицами, он естественным образом подходит для сравнения двух.
То, что он на самом деле делает под капотом, немного сложно, и на самом деле он использует разные подходы в зависимости от того, что он может рассказать о ваших таблицах (индексах и т.д.), Но одна из основных идей заключается в том, что он выполняет быстрые контрольные суммы CRC32 для фрагментов индексов, и если контрольные суммы не совпадают, он проверяет эти записи более тщательно. Обратите внимание, что этот метод намного быстрее, чем линейное прохождение обоих индексов и их сравнение.
Тем не менее, это только часть пути. Поскольку сгенерированные команды предназначены для синхронизации реплики с ее хозяином, они просто заменяют текущее содержимое реплики для всех отличающихся записей. Другими словами, сгенерированные команды изменяют all
поля в записи (а не только те, которые были изменены). Итак, как только вы используете pt-table-sync
для поиска различий, вам нужно будет обернуть результаты во что-то, чтобы изучить отличающиеся записи, сравнивая каждое поле в записи.
Но pt-table-sync
делает то, что, как вы уже знали, является сложной частью: действительно быстро обнаруживает различия. Она написана на Perl; исходный код должен содержать хорошие панировочные сухари.
Ответ №2:
Я бы подумал о создании индекса для этого столбца в каждой базе данных, а затем с помощью программы для параллельной обработки каждой базы данных с использованием упорядочения по этому столбцу. Это улучшит работу в обеих, поскольку у вас есть одинаковые записи, и в одной или другой, если вы обнаружите, что они не синхронизированы (отслеживая записи вне последовательности). Создание индекса может быть очень дорогостоящим с точки зрения как времени, так и пространства (по крайней мере, на начальном этапе). Однако, если вы собираетесь продолжать добавлять записи, их обновление может не привести к большим накладным расходам. Как только у вас будет индекс на месте, вы сможете обработать разницу за линейное время. Создание индекса — при условии, что у вас достаточно места — должно быть операцией O (nlogn).
Комментарии:
1. Я забыл упомянуть, что индексы уже были вычислены, должен ли я экспортировать столбец в файл, а затем использовать какую-нибудь утилиту unix diff?
2. @user — Я бы не стал. Я бы, вероятно, просто написал программу, которая выполняет select / orderby для столбца в каждой базе данных и просматривает их, вычисляя разницу по ходу работы.