Самый эффективный способ импортировать данные из одной базы данных MySQL в другую - PullRequest
1 голос
/ 19 ноября 2009

Я пишу скрипт PHP, который импортирует данные из таблиц двух разных баз данных в другую. У меня все работает нормально с образцами данных, за исключением того, что теперь я перешел к использованию данных, более похожих на их конечное использование: более 25 миллионов записей на таблицу, и растет с каждым днем. Очевидно, что эффективность немного беспокоит.

Вот как это работает на данный момент. Я копирую структуру таблицы, добавляя пару дополнительных полей для сохранения целостности ключа:

other1.someTable (field1, field2, field3) Pk = [field1, field2]
other2.someTable (field1, field2, field3) Pk = [field1, field2]
mydb.someTable   (id, source, field1, field2, field3)
    Pk = id, Unique key = [source, field1, field2]

А вот и SQL. Он имеет оператор ON DUPLICATE KEY UPDATE, потому что этот импорт должен выполняться регулярно, обновляя данные в «mydb». К счастью, записи не будут удалены из «другой» базы данных (я думаю!).

INSERT INTO mydb.someTable (source, field1, field2, field3)
SELECT 1, field1, field2, field3 FROM other1.someTable
ON DUPLICATE KEY UPDATE field1 = field1, field2 = field2, field3 = field3;

INSERT INTO mydb.someTable (source, field1, field2, field3)
SELECT 2, field1, field2, field3 FROM other2.someTable;
ON DUPLICATE KEY UPDATE field1 = field1, field2 = field2, field3 = field3;

У меня такой вопрос: Является ли это наилучшим из возможных способов сделать это? Существуют ли другие способы, которые могли бы быть более быстрыми, учитывая, что будут миллионы и миллионы записей на общую сумму много гигабайт данные на таблицу?

Ответы [ 3 ]

2 голосов
/ 19 ноября 2009

Вы уверены, что нет повторяющихся идентификаторов? Или, если есть, вы всегда будете перезаписывать их данными из второй базы данных?

Кроме того, выполняете ли вы какую-либо обработку данных, полученных из DB1 / DB2, перед вставкой / обновлением в 3-ю базу данных?

Если ответы «да» на первый вопрос и «нет» на третий, вероятно, будет намного быстрее использовать LOAD DATA INFILE . Выберите данные из DB1 и DB2 и последовательно загрузите их.

0 голосов
/ 19 ноября 2009

Рассматривали ли вы использование федеративных таблиц ?

0 голосов
/ 19 ноября 2009

При обновлении ключа при дублировании не нужно обновлять field1 и field2, поскольку они являются ключом и были сопоставлены.

Другой вопрос: вас волнует, если 1 устанавливает field3 в одно значение, а затем 2 устанавливает его в другое - и снова завтра, и на следующий день - произошло ли это что-то, чтобы узнать?

...