Giả định của bạn là sai; truy vấn con sẽ chỉ được thực thi một lần. Lý do tại sao nó chậm hơn tham gia là vì IN
không thể tận dụng các chỉ mục; nó phải quét các đối số của nó một lần cho mỗi lần WHERE
mệnh đề được đánh giá, nghĩa là một lần mỗi hàng trong bảngA. Bạn có thể tối ưu hóa truy vấn mà không cần sử dụng các biến hoặc thủ tục được lưu trữ, chỉ bằng cách thay thế IN
với một tham gia, do đó:
SELECT tableA.field1, tableA.field2, [...]
FROM tableA
INNER JOIN tableB ON tableA.id = tableB.id
Trừ khi bạn không ngại lấy lại mọi trường từ cả hai bảng, bạn cần liệt kê các trường bạn muốn trong SELECT
mệnh đề; tableA.*
chẳng hạn, sẽ gây ra lỗi cú pháp.