Được rồi, tôi đã thử nghiệm điều này trên hơn 30.000 bản ghi mỗi bảng và nó chạy khá nhanh.
Như hiện tại, bạn đang thực hiện một phép nối trên hai bảng lớn nhưng nếu bạn quét tìm các kết quả phù hợp trên 'val' trên mỗi bảng trước tiên, điều đó sẽ làm giảm đáng kể kích thước của nhóm phép nối của bạn.
Ban đầu, tôi đã đăng câu trả lời này dưới dạng một tập hợp các truy vấn con nhưng tôi không nhận ra rằng MySQL rất chậm với các truy vấn con lồng nhau vì nó thực thi từ bên ngoài vào. Tuy nhiên, nếu bạn xác định các truy vấn con là dạng xem, nó sẽ chạy chúng từ trong ra ngoài.
Vì vậy, trước tiên hãy tạo các chế độ xem.
CREATE VIEW tbl1_iii AS (
SELECT * FROM tbl1 WHERE val='iii'
);
CREATE VIEW tbl2_iii AS (
SELECT * FROM tbl2 WHERE val='iii'
);
Sau đó chạy truy vấn.
SELECT tbl1_iii.id from tbl1_iii,tbl2_iii
WHERE tbl1_iii.id = tbl2_iii.id;
Sét.