@romanpostovalov
Developer

Как скопировать миллионы строк из одной таблицы в другую?

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

Первое что приходит в голову:
1) Написать миграцию на doctrine, скорее всего будет очень медленно
2) Написать SQL запрос, который запустить в консоли, что чревато из за долго выполнения, особенно если там будут подзапросы
3) Ограничить количество обрабатываемых записей за раз, добавить лимит или пакетную обработку
4) Использовать какие то встроенные инструменты копирования, бэкапа.
  • Вопрос задан
  • 222 просмотра
Пригласить эксперта
Ответы на вопрос 1
romesses
@romesses
Backend инженер
INSERT INTO ... 
SELECT ... 
WHERE ...
LIMIT ...

https://www.w3schools.com/sql/sql_insert_into_sele...
В зависимости от того насколько разные таблицы и какие поля NOT NULL может понадобиться заполнение какими-то данными. На малой выборке нужно сначала отладить запрос SELECT с необходимыми трансформациями и индексами. Как только SELECT будет работать исправно для разных случаев, запустить частичную миграцию, проверив как получается. Потом, опустошив целевую таблицу с TRUNCATE TABLE, запустить полную миграцию через Doctrine, при условии, что умеет генерировать подобный запрос корректно, конечно.
На миллионах будет работать нормально.

Добавил
Для контроля дубликатов использовать
https://www.mysqltutorial.org/mysql-insert-or-upda...
- update или ignore
Ответ написан
Ваш ответ на вопрос

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

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