Można to uprościć do:
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
Dodałem ORDER BY
klauzula, której nie potrzebujesz, ale niektóre zapytania mogą przynieść korzyści, jeśli wstawisz dane w taki (lub inny) sposób.
Jeśli chcesz uniknąć utraty wierszy, w których nie możesz znaleźć pasującego wiersza w language
lub template
, zrób to LEFT JOIN
zamiast JOIN
dla obu tabel (pod warunkiem, że language_id
i template_id
może być NULL
.
Oprócz tego, co już wymieniłem pod pytaniem wstępnym :Jeśli INSERT jest ogromny i stanowi dużą część tabeli docelowej, prawdopodobnie szybciej UPUŚCIĆ wszystkie indeksy w tabeli docelowej, a następnie odtwórz je. Tworzenie indeksów od podstaw to dużo szybciej niż aktualizować je stopniowo dla każdego wiersza.
Unikalne indeksy dodatkowo służą jako ograniczenia, więc musisz zastanowić się, czy egzekwować reguły później, czy pozostawić je na miejscu.