Это можно упростить до:
INSERT INTO translation (id, translated, language_id, template_id)
SELECT tmp.id, tmp.translated, l.id, t.id
FROM tmp_table tmp
JOIN language l USING (langname)
JOIN template t USING (tplname, source, domain)
ORDER BY tmp.id
Я добавил предложение ORDER BY
, которое вам не нужно строго, но некоторые запросы могут получить прибыль, если вы вставите свои кластеризованные данные (или некоторые другие)way.
Если вы хотите избежать потери строк, в которых вы не можете найти подходящую строку в language
или template
, сделайте его LEFT JOIN
вместо JOIN
дляобе таблицы (при условии, что language_id
и template_id
могут быть NULL
.
В дополнение к тому, что я уже перечислил под вопросом приквел : если INSERT огромен и составляетБольшая часть целевой таблицы, вероятно, быстрее УДАЛИТЬ все индексы на целевой таблице и впоследствии создавать их заново. Создание индексов с нуля намного быстрее, чем их постепенное обновление для каждогоrow.
Уникальные индексы дополнительно служат ограничениями, поэтому вам придется решить, применять ли правила позже или оставить их на месте.