これは次のように簡略化できます:
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が巨大で、ターゲットテーブルの大部分を占める場合は、すべてのインデックスを削除する方がおそらく高速です。 ターゲットテーブルで、後でそれらを再作成します。インデックスを最初から作成することはたくさんです 行ごとに段階的に更新するよりも高速です。
一意のインデックスはさらに制約として機能するため、後でルールを適用するか、そのままにしておくかを検討する必要があります。