これは次のように簡略化できます:
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を追加しました 厳密には必要ありませんが、その(または他の)方法でクラスター化されたデータを挿入すると、特定のクエリが利益をもたらす可能性があります。
languageで一致する行が見つからない行が失われないようにしたい場合 またはtemplate 、 LEFT JOINにします JOINの代わりに 両方のテーブル(language_idの場合) およびtemplate_id NULLにすることができます 。
前編の質問 の下にすでにリストしたものに加えて :INSERTが巨大で、ターゲットテーブルの大部分を占める場合は、すべてのインデックスを削除する方がおそらく高速です。 ターゲットテーブルで、後でそれらを再作成します。インデックスを最初から作成することはたくさんです 行ごとに段階的に更新するよりも高速です。
一意のインデックスはさらに制約として機能するため、後でルールを適用するか、そのままにしておくかを検討する必要があります。