Trong MySQL, thực hiện một truy vấn con như thế này là một "truy vấn tương quan". Điều này có nghĩa là kết quả của SELECT
bên ngoài phụ thuộc vào kết quả của SELECT
bên trong . Kết quả là truy vấn bên trong của bạn được thực thi một lần trên mỗi hàng, điều này rất chậm.
Bạn nên cấu trúc lại truy vấn này; cho dù bạn tham gia hai lần hay sử dụng hai truy vấn hầu hết đều không liên quan. Tham gia hai lần sẽ mang lại cho bạn:
SELECT something
FROM posts
INNER JOIN tag_map ON tag_map.id = posts.id
INNER JOIN tags ON tags.tag_id = tag_map.tag_id
WHERE tags.tag IN ('tag1', ...)
Để biết thêm thông tin, hãy xem hướng dẫn sử dụng MySQL về cách chuyển đổi truy vấn con thành JOIN .
Mẹo:EXPLAIN SELECT
sẽ chỉ cho bạn cách trình tối ưu hóa lập kế hoạch xử lý truy vấn của bạn. Nếu bạn thấy DEPENDENT SUBQUERY
bạn nên cấu trúc lại, chúng quá chậm.