Điều này có thể được đơn giản hóa thành:
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
Tôi đã thêm một ORDER BY
điều khoản mà bạn không thực sự cần, nhưng một số truy vấn nhất định có thể có lợi nếu bạn chèn dữ liệu của mình được nhóm theo cách đó (hoặc một số cách khác).
Nếu bạn muốn tránh mất các hàng mà bạn không thể tìm thấy một hàng phù hợp bằng language
hoặc template
, hãy đặt nó thành LEFT JOIN
thay vì JOIN
cho cả hai bảng (miễn là language_id
và template_id
có thể là NULL
.
Ngoài những gì tôi đã liệt kê trong câu hỏi tiền truyện :Nếu INSERT lớn và chiếm tỷ lệ lớn trong bảng mục tiêu, thì việc DROP tất cả các chỉ mục có thể nhanh hơn trên bảng mục tiêu và tạo lại chúng sau đó. Tạo chỉ mục từ đầu là rất nhiều nhanh hơn sau đó cập nhật chúng tăng dần cho mọi hàng.
Các chỉ mục duy nhất cũng đóng vai trò như các ràng buộc, vì vậy bạn sẽ phải cân nhắc xem có nên thực thi các quy tắc sau này hay để chúng tại chỗ.